2012-04-11 11 views
0

動的にSQLステートメントを作成するストアドプロシージャを作成してテーブルレコードを更新しようとしました。私はいくつかのコードを書いていますが、このクエリを動的に実行するのをやめました。このクエリを実行するにはどうすればよいですか?ストアドプロシージャ内の更新SQLを動的に作成

どのようにこのSPは動作しますか?=>私は「その後のノードを移動し、UPDATE文を作成し、列の名前、値、および

<e columnName=''PaymentStatus'' value=''99'' type=''nvarchar''/> 
<e columnName=''HotelProvider'' value=''GAT2'' type=''nvarchar''/> 

以下のようにSPにアップデート必要なレコードのデータ型を送ることができますが、それを実行:))

私はSPの一部を与えるより良い質問を理解する。

DECLARE @UpdateXml xml = ' 
<xml> 
<e columnName=''PaymentStatus'' value=''99'' type=''nvarchar''/> 
<e columnName=''HotelProvider'' value=''GAT2'' type=''nvarchar''/> 
</xml>'; 


DROP TABLE ##UpdateFields 
SELECT 
t.c.value('@columnName', 'varchar(max)') AS ColumnName, 
t.c.value('@value', 'varchar(max)') AS Value, 
t.c.value('@property', 'varchar(max)') AS PropertyOf, 
t.c.value('@type', 'varchar(max)') AS ColumnType 
INTO ##UpdateFields 
from @UpdateXml.nodes('/xml/e') as t(c) 

DECLARE @SQL nvarchar(MAX) = 'UPDATE HotelBooking '; 

DECLARE @SQLUpdatePart nvarchar(MAX); 
SET @SQLUpdatePart = 'SET '; 
SELECT @SQLUpdatePart= @SQLUpdatePart+ColumnName +'='+'@QP_'+ColumnName+',' FROM ##UpdateFields WHERE PropertyOf IS NULL; 

DECLARE @SQLWherePart nvarchar(MAX); 
SET @SQLWherePart = ' WHERE Id=2'; 

DECLARE @ParmDefinition nvarchar(MAX)=''; 
SELECT @ParmDefinition = @ParmDefinition+'@QP_'+ColumnName+' '+ColumnType+',' FROM ##UpdateFields; 


SELECT @ParmDefinition 
SELECT @SQL + @SQLUpdatePart + @SQLWHerePart; 

最終2つの選択ステートメントの結果は以下のとおりです。

@QP_PaymentStatus nvarchar,@QP_HotelProvider nvarchar,@QP_TransactionId uniqueidentifier,@QP_UpdatedDate datetime 

UPDATE HotelBooking SET [email protected]_PaymentStatus,[email protected]_HotelProvider,[email protected]_UpdatedDate,[email protected]_TransactionId WHERE Id=2 

は今、どのように私は動的に()メソッドをsp_executesqlをする@QPパラメータを与えることができますか?

答えて

1

あなたは別のexecにsp_executesqlを呼び出しをラップすることによってそれを行うことができます。

declare @updateStr nvarchar(1000) 
-- @updateStr = N'select * from ATable where ID = @p1' 
set @updateStr = N'N''select * from ATable where ID = @p1''' 
declare @paramStr nvarchar(100) 
-- @paramStr = N'@p1 int' 
set @paramStr = N'N''@p1 int''' 
declare @actualParameters nvarchar(100) 
set @actualParameters = N'@p1 = 10' 
-- Concatenate parts of query into a variable 
declare @sql nvarchar(max) 
set @sql = N'sp_executesql ' + @updateStr + ',' + @paramStr + ', ' + @actualParameters 
-- And voila! 
exec (@sql) 
+0

をねえ、これは簡単な解決策、感謝です。 – Yucel

関連する問題