2016-10-19 4 views
-3

私は1つのストアドプロシージャを含む古いプロジェクトで動作します。私はそのストアドプロシージャを理解することはできませんし、以下はストアドプロシージャのSQLクエリです。sqlストアドプロシージャをint SQLクエリを

USE [Mydb] 
GO 
/****** Object: StoredProcedure [dbo].[usp_SearchCAMAStructure] Script Date: 10/19/2013 2:08:16 PM ******/ 
SET ANSI_NULLS ON 
GO 
SET QUOTED_IDENTIFIER ON 
GO 

ALTER PROCEDURE [dbo].[usp_SearchCAMAStructure] 
@section as nvarchar(max), 
@quality as nvarchar(max), 
@style as nvarchar(max), 
@ward as nvarchar(max), 
@improvment as nvarchar(max), 
@condition as nvarchar(max) 
As 
Begin 

SET NOCOUNT ON; 
--SET STATISTICS TIME ON; 
Declare @Where as varchar(max) 
Declare @Select as varchar(max) 

Set @Select = ' Distinct vi.struct_no as structure, a.assesmt_no as assessment, o.own_last+'' , ''+o.own_first as taxpayer, id.year_built as built, id.effect_age as age, vi.aprais_val as mktvalue, a.parcel_no as parcel 
       From [dbo].assessments a 
       inner join parcel p on a.parcel_no = p.parcel_no 
       inner join valueimp vi on vi.assesmt_no = a.assesmt_no and (vi.status is null or vi.status = 0) 
       inner join owner o on o.id = a.owner_id 
       inner join imp_details id on id.improvementId = vi.id and (id.isdeleted is null or id.isdeleted = 0) 
       inner join quality_details qd on qd.quality_id = id.quality_id 
       inner join section_details sd on sd.section_id = id.section_id 
       inner join style_details stdl on stdl.style_id = id.style_id 
       inner join parcel pw on p.ward_no = pw.ward_no' 

Set @Where = ' where (@section IS NULL OR sd.section_id = @section) 
AND (@quality IS NULL OR qd.quality_id = @quality) 
AND (@style IS NULL OR stdl.style_id = @style) 
AND (@ward IS NULL OR pw.ward_no = @ward) 
AND (@improvment IS NULL OR id.improvementId = @improvment)' 

if @condition = 1 --Equal to 
Begin 
Set @Where = @Where + ' and (' [email protected]+ ' is null or id.effect_age = ' [email protected]+ ')' 
end 
else 
if @condition = 2 --Greater than or Equal 
Begin 
Set @Where = @Where + 'and (' [email protected]+ ' is null or id.effect_age > ' [email protected]+ ')' 
end 
else 
if @condition = 3 --Less than or equal 
Begin 
Set @Where = @Where + 'and (' [email protected]+ ' is null or id.effect_age < ' [email protected]+ ')' 
end 

DECLARE @QUERY NVARCHAR(MAX)  

SET @QUERY= 'Select '+ @SELECT + @WHERE 
print @QUERY 
EXEC sp_executesql @QUERY , N'@section as nvarchar(max) ,@quality as nvarchar(max),@style as nvarchar(max),@ward as nvarchar(max),@improvment as nvarchar(max)',@section ,@quality,@style,@ward,@improvment 

END 

上記のストアドプロシージャのSQLクエリは次のとおりです。

+0

パラメータに応じていくつかのバリエーションを持つ動的クエリーを '@ QUERY'変数に組み込み、それを実行します。声明に従うだけで、どれくらい難しいのでしょうか? –

答えて

1

ないすべてのパラメータは、このストアドプロシージャを通過したが、これはスクリプト以下と同等であってもよいし、ちょうどここで適切な値

SELECT Distinct vi.struct_no as structure, 
     a.assesmt_no as assessment, 
     o.own_last , 
     o.own_first as taxpayer, 
     id.year_built as built, 
     id.effect_age as age, 
     vi.aprais_val as mktvalue, 
     a.parcel_no as parcel 
From [dbo].assessments a 
inner join parcel p on a.parcel_no = p.parcel_no 
inner join valueimp vi on vi.assesmt_no = a.assesmt_no and (vi.status is null or vi.status = 0) 
inner join owner o on o.id = a.owner_id 
inner join imp_details id on id.improvementId = vi.id and (id.isdeleted is null or id.isdeleted = 0) 
inner join quality_details qd on qd.quality_id = id.quality_id 
inner join section_details sd on sd.section_id = id.section_id 
inner join style_details stdl on stdl.style_id = id.style_id 
inner join parcel pw on p.ward_no = pw.ward_no 
WHERE 
(@section IS NULL OR sd.section_id = @section) AND 
(@quality IS NULL OR qd.quality_id = @quality) AND 
(@style IS NULL OR stdl.style_id = @style) AND 
(@ward IS NULL OR pw.ward_no = @ward) AND 
(@improvment IS NULL OR id.improvementId = @improvment) AND 
1 = (CASE 
    WHEN @condition = 1 AND (@improvment is null or id.effect_age = @improvment) THEN 1 
    WHEN @condition = 2 AND (@improvment is null or id.effect_age > @improvment) THEN 1 
    WHEN @condition = 3 AND (@improvment is null or id.effect_age < @improvment) THEN 1 
    END) 
0

でパラメータを置き換えについては、このストアドプロシージャを実行しようとしたときにどのようなあなたの寄付いくつかのパラメータを持っていることを確認。

@section as nvarchar(max), 
@quality as nvarchar(max), 
@style as nvarchar(max), 
@ward as nvarchar(max), 
@improvment as nvarchar(max), 
@condition as nvarchar(max) 

SQLクエリの2つの部分があり、1つは@Select変数に、もう1つは@Where変数にあります。 @Selectは結合および選択された列名を保持し、@条件節の入力に基づいて@Where節を作成しています。 ここで文字列の連結が使用されている、あなたはGoogleのSQL Serverの文字列のconcatの詳細ができます。
最後に、あなたは

SET @QUERY= 'Select '+ @SELECT + @WHERE 

や印刷に@Selectおよび@Where句を使用して完全なクエリを作成し、クエリを実行しています。

関連する問題