2016-11-05 4 views
0

複数のSQL文を単一のexec sp_executesql文として実行したいのが理想です。複数の動的T-SQL文に対するsp_executeバッチの実行

drop proc ai_ImportDataAddListPosn 
go 

create proc ai_ImportDataAddListPosn(@ParamTableName NVARCHAR(255), @debug INT) 
AS 
BEGIN 
DECLARE @sql AS NVARCHAR(4000) 
SET @sql = N'IF NOT EXISTS(SELECT * FROM syscolumns INNER JOIN sysobjects ON syscolumns.id = sysobjects.id WHERE sysobjects.name = ''' + @ParamTableName + ''' AND Syscolumns.name = ''ListPosn'');' 
      + 'alter table [' + @ParamTableName + '] add ListPosn int identity(1,1)' 
IF @debug = 1 PRINT @sql 
EXEC sp_executesql @sql 
END 
Go 

EXEC ai_ImportDataAddListPosn DeptForMove, 1 

私は、この例では、最初のテーブルが存在するかどうかをテストしないことを認識し、そのわずか簡単な例ではない本当の私は1 IFが第二の文が実行されるかどうかを判断するために存在する使用場所の例は次のようになります問題。私はSQLインジェクションとそれとの戦いを知っています。私は合理的に両方のステートメントが良いと幸せですSQL

私は ";ステートメントターミネーターとして動作する可能性があります

+0

改行の前に改行を挿入する必要があります。 –

答えて

0

私はSQLインジェクションとそれに対処する方法も知っています。私は合理的です 両方のステートメントが良いことを幸せSQL

質問にその痕跡がありません。パラメータ化とQUOTENAMEを使用する必要があります。

私は ";"ステートメントターミネーターとして動作する可能性があります。

ステートメントターミネーターはありません。

IF 1=1; SELECT 'Foo'; 

が無効です。

IF 1=1 SELECT 'Foo'; 

しかし、うまくいくでしょう。 Boolean_expressionの後のセミコロンを空白に置き換えるだけで済みます。

+0

私はデバッグプリントを持っていたので、出力と生成されたSQL(これは私が行った)を実行する能力を持っていることが分かりました。私は文を分割し、両方とも解析しました。無効な構文を指摘していただきありがとうございます。実際に私は自分自身でパラメトリゼーションの結論に達しましたが、第4の無関係のエラッタ編集の後に価値のある実際の反応があるかもしれないと考えていました。あなたの応答は、OCD編集者の泥だらけの群衆の上に立っています。 – user2711068

関連する問題