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)
答案 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)