Переменная в T-SQL - PullRequest
       26

Переменная в T-SQL

2 голосов
/ 28 марта 2011

У меня есть код T-SQL следующим образом:

declare @xml xml = N'
<a abb="122">
    <b>
    </b>
</a>
<a abb="344">
    <b>
    </b>
</a>';

declare @T table (XMLCol xml);

insert into @T values (@xml);

declare @sql varchar(max);
set @sql = 'update @T set
                     XMLCol.modify(''
                            replace value of (/a/@abb)[1] 
                            with 888'');';
exec (@sql);

Когда я выполняю, появляется сегмент ошибки:

Msg 1087, Level 15, State 2, Line 1
Must declare the table variable "@T".

Как объявить переменную @T для понимания?

Ответы [ 6 ]

1 голос
/ 29 марта 2011

Потому что вам нужно объявить все внутри динамической части запроса.В вашем случае я до сих пор не понимаю, зачем вам нужен динамический запрос, но если он необходим, он должен выглядеть так:

declare @sql varchar(max);
set @sql = '
declare @xml xml = N''
<a abb="122">
    <b>
    </b>
</a>
<a abb="344">
    <b>
    </b>
</a>'';

declare @T table (XMLCol xml);
insert into @T values (@xml);
update @T set
                     XMLCol.modify(''
                            replace value of (/a/@abb)[1] 
                            with 888'');';
exec (@sql);
1 голос
/ 28 марта 2011

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

Вместо этого используйте временную таблицу.

1 голос
/ 28 марта 2011

Вы можете использовать временную таблицу вместо табличной переменной.

declare @xml xml = N'
<a abb="122">
    <b>
    </b>
</a>
<a abb="344">
    <b>
    </b>
</a>';

create table #T (XMLCol xml);

insert into #T values (@xml);

declare @sql varchar(max);
set @sql = 'update #T set
                     XMLCol.modify(''
                            replace value of (/a/@abb)[1] 
                            with 888'');';
exec (@sql);

drop table #T
0 голосов
/ 17 августа 2017
declare @xml xml = N'
<a abb="122">
    <b>
    </b>
</a>
<a abb="344">
    <b>
    </b>
</a>';

declare @T table (XMLCol xml);

insert into @T values (@xml);


select * from @t
update @T set XMLCol.modify('replace value of (/a/@abb)[1] with 888');
select * from @t

Это будет работать для вашего результата

0 голосов
/ 28 марта 2011

Поскольку ваш @sql выполняется в другом блоке выполнения, он не найдет его.Вам необходимо объявить свой @t внутри переменной "@sql", включая все транзакции, связанные с вашим @ t.

0 голосов
/ 28 марта 2011

Переменные таблицы не видны во внутренних SP, поэтому вы должны определить временную таблицу там, а не переменную таблицы.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...