2015-06-29 2 views
0
declare @text as varchar(100) 
declare @rep as varchar 
declare @ac as varchar 
declare @sub as varchar(4) 
declare @stmt as varchar(50) 

set @text='1214324324234324' 

set @ac='2' 

set @rep ='4' 

set @sub='@rep' 

set @stmt = 'Select Replace('''[email protected]+''','''[email protected]+''','[email protected]+')' 

print @stmt 
--dynamic query execution 
exec(@stmt) 

Я столкнулся с проблемой ниже.динамический SQL-запрос в SQL Server

Выберите Заменить ('1214324324234324', '2', @ реп) Msg 137, Level 15, Государственный 2, строка 1 Необходимо объявить скалярную переменную "@rep"

ответ

-1

Вам нужно запустить весь оператор сразу. Если вы запускаете по одной строке за раз, SQL забудет переменные, которые вы ранее объявили. Я взял весь ваш SQL и запустил его, и это сработало отлично для меня.

+0

Нет, это не причина –

+0

ты прав ... Когда я ответил на вопрос, ехес заявление было в комментариях, и я пропустил его. Все остальное было хорошо для меня, поэтому я решил, что они управляют этой одной строкой за раз. Глупая ошибка с моей стороны! – Wolves

1

Ваша ошибка довольно ясна.

set @rep ='4' 
set @sub='@rep' 

Вы устанавливаете значение @rep и использовать другую переменную (@sub), чтобы указать на предыдущей назначенной переменной @rep. На самом деле, ваш динамический оператор SQL комбинируется следующим образом:

set @stmt = 'Select Replace('''[email protected]+''','''[email protected]+''','[email protected]+')' 

Это будет интерпретироваться как это: SELECT REPLACE('1214324324234324','2',@rep)

Ваш динамический не знает, что есть переменная @rep. Вам необходимо ввести @rep в ваш динамический SQL вместо этого дополнительного назначения на @sub.

Вы можете использовать это:

set @stmt = 'Select Replace('''[email protected]+''','''[email protected]+''','[email protected]+')' 
Смежные вопросы