在预期条件的上下文中指定的非布尔类型的表达式,接近' @ where'

时间:2018-06-01 14:02:52

标签: 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(@str)

5 个答案:

答案 0 :(得分:2)

你也可以在没有动态sql的情况下做到这一点。像这样的东西。 1 = 1的地方很傻,所以我删除了它。当然,1> 2将被某种真实条件所取代。

select *
from dbo.Party_Details
where 1 = case when 1 > 2 then Test_Group_Id else Party_Master end

答案 1 :(得分:1)

试试这个

  SELECT  execution_date
       ,  MIN(start_date) AS start
       ,  MAX(end_date) AS end
       ,  MAX(end_date) - MIN(start_date) AS duration
    FROM  task_instance
   WHERE  dag_id = 'blah'
     AND  state = 'success'
GROUP BY  execution_date
ORDER BY  execution_date DESC

答案 2 :(得分:0)

你缺少基础......

编辑:对OP和Peter的解释

语法被破坏,因为运行的实际SELECT语句是

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

对于sql server没有任何意义,因为在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)

答案 3 :(得分:0)

这有效

    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部分之外定义变量。

答案 4 :(得分:0)

虽然其他人提供了可以达到明显期望的最终结果的解决方法,但以下是您收到错误的实际原因,以防您要问的是:

您正在尝试在动态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的INSIDE代码未在最终选择中尝试将@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)