将动态SQL生成XML的结果存储到XML变量

时间:2014-04-03 15:09:45

标签: sql sql-server xml stored-procedures ssms

所以我在SO中发现了大量的例子,展示了如何将动态SQL的结果分配给变量,但是我还没有找到一个以我想要的方式做到的...所以要么我要去这是错误的方式,或者我还没有找到正确的语法来正确执行此操作。

基本上,我尝试在使用存储过程从表中删除行(将其视为对表的审计)之前,从表中创建行的XML记录。我试图通过动态SQL执行此操作,以便可以从多个其他存储过程调用存储过程,这些存储过程对其相应的表执行删除操作,但在此之前它们传递必要的信息(包含选择的@sql变量)声明获取本审计存储过程的记录。

Create Procedure dbo.AuditDelete(
@sql NVARCHAR(200),
@TableName VARCHAR(50),
@UserName NVARCHAR(256)
)
AS
  DECLARE @XML XML
BEGIN
  --at this point @sql will contain a select statement written by the calling stored procedure
  --which is specifically written to return the record that is being deleted, example:
@sql = select * from my.table where tableId = 1 FOR XML AUTO

  execute sp_executesql @sql, N'@XML XML OUTPUT', @XML = XML OUTPUT;
  SELECT @XML 
              --I was doing this as a check to ensure that XML has the record
              --because the execute command returned the XML record, but @XML is null...
              --and I can't figure out why

  --code for inserting into the Audit table

所以我确定它缺少一些语法,或者我可能只是以错误的方式解决这个问题。有什么建议吗?

注意:这是在SQL Server 2008 R2上的SSMS中完成的

1 个答案:

答案 0 :(得分:7)

您需要将查询结果分配给动态SQL中的参数。

set @sql = N'set @XML = (select * from my.table where tableId = 1 FOR XML AUTO)'
execute sp_executesql @sql, N'@XML XML OUTPUT', @XML OUTPUT