Выражение не булева типа, указанное в контексте, где ожидается условие, около '@where' - PullRequest
0 голосов
/ 01 июня 2018
DECLARE @str VARCHAR(MAX)=''

SET @str='
DECLARE @where VARCHAR(max)=''''

IF 1>2 
BEGIN
SET @where='' Test_Group_Id=1''
END
ELSE
BEGIN
SET @where='' Party_Master_Id=1''
END

SELECT * FROM dbo.Party_Details WHERE 1=1 and @where';

EXECUTE(@str)

Ответы [ 5 ]

0 голосов
/ 01 июня 2018

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

Вы пытаетесь сделатьдинамический SQL-запрос внутри динамического SQL-запроса, но вы делаете это только наполовину.

Если бы вы напечатали @str вместо его выполнения, вы увидите:

DECLARE @where VARCHAR(max)=''''

IF 1>2 
BEGIN
SET @where='' Test_Group_Id=1''
END
ELSE
BEGIN
SET @where='' Party_Master_Id=1''
END

SELECT * FROM dbo.Party_Details WHERE 1=1 and @where

КодВНУТРИ @str не предпринимает никаких попыток заменить @where значением @where при окончательном выборе.

Чтобы полностью выполнить динамический запрос внутри динамического запроса, необходимо выполнитьвся строка-конкат плюс EXEC.Так что это будет работать:

DECLARE @str VARCHAR(MAX)=''

SET @str='
DECLARE @where VARCHAR(max)=''''
DECLARE @str2 varchar(max)

IF 1>2 
BEGIN
SET @where='' Test_Group_Id=1''
END
ELSE
BEGIN
SET @where='' Party_Master_Id=1''
END

SET @str2 = ''SELECT * FROM dbo.Party_Details WHERE 1=1 and '' + @where
EXECUTE(@str2)
';

EXECUTE(@str)
0 голосов
/ 01 июня 2018

Это работает

    DECLARE @str VARCHAR(MAX);

set @str= '
DECLARE @str VARCHAR(MAX);
DECLARE @where VARCHAR(max);
IF 1>2 
BEGIN
 SET @where='' Test_Group_Id=1''
END
ELSE
BEGIN
 SET @where='' Party_Master_Id=1''
END
set @str=''SELECT * FROM dbo.Party_Details WHERE 1=1 AND '' + @where
exec(@str)
'
exec(@str)

Это работает, потому что нет преобразования типов, тогда будет работать строковое значение, которое вы передадите в функцию execute.Лучше всего по возможности определять переменные вне секции динамического SQL.

0 голосов
/ 01 июня 2018

Вам не хватает основ ...

РЕДАКТИРОВАТЬ: объяснение ОП и Питера

синтаксис был нарушен, поскольку действительный оператор SELECT, который выполняется, был

SELECT * FROM dbo.Party_Details WHERE 1=1 and 'Party_Master_Id=1'

Это не имеет смысла для сервера sql, потому что нет условия для проверки после оператора AND.

это должно работать

DECLARE @str VARCHAR(MAX)=''
DECLARE @where VARCHAR(max)=''

IF 1>2 
BEGIN
SET @where='Test_Group_Id=1'
END
ELSE
BEGIN
SET @where='Party_Master_Id=1'
END


SET @str='SELECT * FROM dbo.Party_Details WHERE 1=1 and '+@where

EXECUTE(@str)
0 голосов
/ 01 июня 2018

Вы можете сделать это и без динамического sql.Что-то вроде этого.И где 1 = 1 просто глупо, поэтому я удалил его.И, конечно же, 1> 2 будет заменено каким-то реальным условием.

select *
from dbo.Party_Details
where 1 = case when 1 > 2 then Test_Group_Id else Party_Master end
0 голосов
/ 01 июня 2018

Попробуйте это

DECLARE @str VARCHAR(MAX)=''

DECLARE @where VARCHAR(max)=''''

IF 1>2 
BEGIN
SET @where= 'Test_Group_Id=1'
END
ELSE
BEGIN
SET @where='Party_Master_Id=1'
END

SET @str = 'SELECT * FROM dbo.Party_Details WHERE 1=1 and ' + @where

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