在存储过程中动态创建更新SQL

时间:2012-04-11 16:33:58

标签: sql tsql

我尝试创建一个存储过程来更新动态创建sql语句的表记录。我编写了一些代码,但我已经停止运行以动态运行此查询,如何运行此查询或是否有更好的解决方案来解决此问题。

此SP如何工作?=>我将需要更新的记录的列名,值和数据类型发送到SP,如下所示

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

然后遍历节点并创建Update语句,但不能执行它:))

我正在给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;

最后两个select语句的结果是:

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

UPDATE HotelBooking SET PaymentStatus=@QP_PaymentStatus,HotelProvider=@QP_HotelProvider,UpdatedDate=@QP_UpdatedDate,TransactionId=@QP_TransactionId WHERE Id=2

现在如何动态地将@QP参数提供给sp_executesql()方法?

1 个答案:

答案 0 :(得分:1)

您可以通过将sp_executesql调用包装在另一个exec中来实现:

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)