所以我在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中完成的
答案 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