динамический sql и хранить вывод в переменной - PullRequest
0 голосов
/ 20 января 2011
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 ]

3 голосов
/ 20 января 2011

Для тех, кто пытается ответить на вопрос, вот несколько примеров таблиц, которые можно использовать

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 голос
/ 21 января 2011

Попробуйте также:

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
0 голосов
/ 20 января 2011

На самом деле нет никакого способа вернуться из динамического sql обратно в вызывающий процесс, если бы он не пах как огромный взлом.

Если вам это абсолютно необходимо, я полагаю, у вас может быть таблица, в которой ваш скриптмог записать свои значения, и ваш proc мог бы затем читать из.

вы можете подумать о том, чтобы делать ваши динамические вещи вне сервера sql, но даже это чревато опасностью.

...