保存中にSQL文をつづり合わせる


多くの場合、私たちはパラメータを利用して記憶過程でSQL文を再組織しなければなりません。記憶過程で綴り合わせたSQL文はただの文字列です。直接実行されないので、executeを追加して実行すればいいです。具体的には下記のデモコードをご覧ください。
 
コード:
set ANSI_NULLS ON
set QUOTED_IDENTIFIER ON
go
-- =============================================
-- Author:		yy
-- Create date: 2012-1-17
-- Description:	    SQL       
-- =============================================
CREATE PROCEDURE [dbo].[Test]
	@FileName varchar(10), --   
	@Operator varchar(1), --   
	@FileValue  varchar(10) --   
AS 
	DECLARE @TempSql varchar(100) --    sql  
BEGIN
	set @TempSql= 'select * from Comment where ' + @FileName + @Operator + char(39) + @FileValue + char(39) --  sql   ,char(39)    
	execute(@TempSql) --  sql   
END
テスト:
execute Test 'newsid','>',4
     この説明では、「ALTERPROCEDURE[dbo].[Test]」から「AS」から「BEGIN」までのコードの違いは何ですか?私のようなSQL初心者は疑問があるはずです。どうして@TempSqlは「AS」から「BEGIN」までの間に定義されていますか?「AS」から「BEGIN」までは臨時変数として定義されていますので、前にDECLAREを追加しなければなりません。他の言語では普通変数の使用方法と同じです。一方、「ALTER PROCEDURE[dbo].[Test]から「AS」までの間で定義されているのは、格納プロセスが呼び出された時に入ってくる必要なパラメータであり、呼び出し時に値を付けなければならず、DECLAREを加えてはいけないということで、文字の定数として認識されています。呼び出し時に値が付けられたら、それ以上の例では@FileName='xxx'のような表記が間違っています。@TempSqlはSQL文を受け取るための一時変数で、初期値はないが、値を受け入れる必要があるので、「AS」から「BEGIN」までの間に定義します。