Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sql-server/24.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql server 在“@where”附近预期条件的上下文中指定的非布尔型表达式_Sql Server_Stored Procedures_Dynamic Sql - Fatal编程技术网

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)