动态sql和存储输出变量

时间:2011-01-20 17:27:03

标签: sql sql-server sql-server-2005 tsql dynamic-sql

declare @SQL nvarchar(100)
set @SQL = ''

select @SQL = @SQL + FieldName + ' as [' + Description + '], '
from FieldsInfo
where TableName = 'Emp'

set @SQL = 'select '+ left(@SQL, len(@SQL)-1) + ' from Emp FOR XML AUTO, ELEMENTS, ROOT(''customers'')'

exec sp_executesql @SQL

上面是动态sql,当它由sp_executesql执行时,我输出为xml。 如果我想将xml存储在变量中。那么我需要在我的tsql脚本中添加....请帮助

3 个答案:

答案 0 :(得分:3)

对于试图关注该问题的其他人,这里有一些使用的样本表

create table emp (a varchar(10), b int, id int identity)
insert emp select 'abc', 1
insert emp select 'def', 2
create table fieldsinfo (tablename sysname, description sysname, fieldname sysname)
insert fieldsinfo select 'emp', 'field 1', 'a'
insert fieldsinfo select 'emp', 'field 2', 'b'

此脚本将生成的XML存储到变量@XML (原始!)

declare @SQL nvarchar(max)
set @SQL = ''

select @SQL = @SQL + FieldName + ' as [' + Description + '], '
from FieldsInfo
where TableName = 'Emp'

set @SQL = 'set @XML = (select '+ left(@SQL, len(@SQL)-1) + ' from Emp FOR XML AUTO, ELEMENTS, ROOT(''customers''))'

declare @Xml xml
exec sp_executesql @SQL, N'@XML xml output', @xml output

select 'I have >>> ', @Xml   -- check contents

答案 1 :(得分:1)

试试这个:

declare @SQL nvarchar(1000)
set @SQL = ''

select @SQL = @SQL + FieldName + ' as [' + Description + '], '
from FieldsInfo
where TableName = 'Emp'


DECLARE @ParmDefinition nvarchar(1000);
DECLARE @XMLValueString varchar(1000);
SET @ParmDefinition = N'@XMLValue varchar(1000) OUTPUT';
set @SQL = 'SELECT @XMLValue = (select '+ left(@SQL, len(@SQL)-1) + ' from Emp FOR XML AUTO, ELEMENTS, ROOT(''customers''))'
print @SQL 
exec sp_executesql @SQL,@ParmDefinition, @XMLValue=@XMLValueString output
SELECT @XMLValueString

答案 2 :(得分:0)

没有任何方法可以从动态sql返回到调用进程,而不会像一个巨大的黑客那样闻起来。

如果你绝对必须,我想你可以有一个表格,你的脚本可以写出它的值,然后你的proc可以读取。

你可能想考虑在sql server之外做一些动态的东西,但即使这样也充满了危险。