Sql server 在“@where”附近预期条件的上下文中指定的非布尔型表达式
试试这个Sql server 在“@where”附近预期条件的上下文中指定的非布尔型表达式,sql-server,stored-procedures,dynamic-sql,Sql Server,Stored Procedures,Dynamic Sql,试试这个 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(@st
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)
你缺少基本的东西 编辑:OP和Peter的解释 语法已中断,因为实际运行的SELECT语句
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)
这对于sql server来说毫无意义,因为在AND运算符之后没有要检查的条件
这应该行得通
SELECT * FROM dbo.Party_Details WHERE 1=1 and 'Party_Master_Id=1'
您也可以在不使用动态sql的情况下执行此操作。像这样的。其中1=1是很愚蠢的,所以我把它去掉了。当然,1>2会被某种实际情况所取代
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)
这很有效
select *
from dbo.Party_Details
where 1 = case when 1 > 2 then Test_Group_Id else Party_Master end
这是因为没有类型转换,传递给execute函数的字符串值将起作用。最好尽可能在动态SQL部分之外定义变量。尽管其他人提供了解决方案,以实现明显期望的最终结果,但以下是出现错误的实际原因,如果您想问: 您正在尝试在动态sql查询中执行动态sql查询,但您只做了一半 如果您打印了@str而不是执行它,您将看到:
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)
@str内部的代码没有试图在其最终选择中用@where的值替换@where
要在动态查询中完全执行动态查询,必须执行整个字符串concat plus EXEC。因此,这将起作用:
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之前,打印@str时,您看到了什么?其中1=1?重点是什么?这完全是在浪费乐观主义者的时间,应该删除。除非你能想出一个1=1为假的时间?事实上,我认为你真的需要更好地解释这一点。您在IF中的测试是IF 1>2,这将始终为false。因此,当查询将从dbo.Party\u Details中选择*,其中Party\u Master\u Id=1;,为什么需要动态SQL;?我无法访问您在下面的评论中引用的第三方Oasis站点-请在此处填写完整的副本。有关更多详细信息,请参阅和。在您回复其他人并澄清此问题后,我意识到这一点。请不要删除我查询的单独部分。动态部分中的全部查询查看我的查询并找到这个变量“@strCrDr”@AshishMaurya没有人删除任何内容-这里的人向您展示了如何正确构造所需的动态SQL。此外,我无法访问第三方Oasis网站-请在此处完整复制。有关更多详细信息,请参阅和。请勿删除我的查询的单独部分。动态部分中的全部查询查看我的查询并找到这个变量“@strCrDr”@AshishMaurya没有人删除任何内容-这里的人向您展示了如何正确构造所需的动态SQL。此外,我无法访问第三方Oasis网站-请在此处完整复制。有关更多详细信息,请参阅和。请勿删除我的查询的单独部分。动态部分中的全部查询查看我的查询并找到此变量“@strCrDr”我的朋友很抱歉,但您应该尝试更好地解释。我真的错过了你想要的say@AshishMaurya@strCrDr不在您的SQL中。如果您的问题中的SQL比您的问题中的SQL多,请不要在没有任何上下文的情况下对所有答案发表评论,并期望人们单击一个没有详细内容的链接。@AshishMaurya没有人删除任何内容-这里的人正在向您展示如何正确构造所需的动态SQL。此外,我无法访问第三方Oasis网站-请在此处完整复制。有关更多详细信息,请参阅和。我希望在游标中使用,以便从dbo.Party\u详细信息中设置@str='SELECT*,其中1=1和'+@未设置
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)