【问题标题】:Incorrect syntax after CTECTE 之后的语法不正确
【发布时间】:2013-01-11 17:40:48
【问题描述】:
declare @SQL nvarchar(max);
with tbl1 as
    (
    SELECT ...
    ),
tbl2 as
    (
    SELECT ...
    ),
tbl15 as
    (
    select [tbl1].[DT],
    [tbl1].[Kr_IL.BTS],
    [tbl2].[Kr_IL.CS],
    from [tbl1], [tbl2]
    where 
    [tbl1].[DT] = [tbl2].[DT] 
    and [tbl1].[DT] = [tbl3].[DT] 
    )

set @SQL = 'select [tbl15].[DT], '
if @tag1 = 1 set @SQL = @SQL + '[tbl15].[Kr_IL.BTS], '
    else set @SQL = @SQL + 'null as [Kr_IL.BTS], '
if @tag2 = 1 set @SQL = @SQL + '[tbl15].[Kr_IL.CS], '
    else set @SQL = @SQL + 'null as [Kr_IL.CS], ';
set @SQL = STUFF(@SQL, len(@SQL), 1, ' from [tbl15]')
exec (@SQL)

这是我遇到问题的存储过程脚本的一部分。消息是:

“消息 156,级别 15,状态 1,过程 SP_select,第 202 行不正确 关键字 'set' 附近的语法。”。

如果我编写一个标准的选择语句(带有完整的列集),它可以正常工作。但我需要“控制”列(根据启用标签的真实数据或空数据)。 根据错误信息,错误点是:

set @SQL = 'select [tbl15].[DT], '

提前致谢。

【问题讨论】:

    标签: sql-server tsql common-table-expression


    【解决方案1】:

    您收到此错误是因为您没有立即在查询中引用 CTE(动态 SQL 不计算在内!)

    您用于控制流程的变量可以通过使用 case 语句直接引入脚本,而不需要动态 SQL:

    SELECT [DT],
           CASE
             WHEN @tag1 = 1 THEN [Kr_IL.BTS]
             ELSE NULL
           END AS BTS,
           CASE
             WHEN @tag2 = 1 THEN [Kr_IL.CS]
             ELSE NULL
           END AS CS
    FROM   tbl15
    

    所以你的整个脚本变成了:

    ;WITH tbl1 AS
        (
        SELECT ...
        ),
    tbl2 AS
        (
        SELECT ...
        ),
    tbl15 AS
        (
        SELECT [tbl1].[DT],
        [tbl1].[Kr_IL.BTS],
        [tbl2].[Kr_IL.CS],
        FROM [tbl1], [tbl2]
        WHERE
        [tbl1].[DT] = [tbl2].[DT]
        AND [tbl1].[DT] = [tbl3].[DT]
        )
    SELECT [DT],
           CASE
             WHEN @tag1 = 1 THEN [Kr_IL.BTS]
             ELSE NULL
           END AS BTS,
           CASE
             WHEN @tag2 = 1 THEN [Kr_IL.CS]
             ELSE NULL
           END AS CS
    FROM   tbl15
    

    【讨论】:

    • 有没有其他方法来处理这个错误?我希望能够在以下动态查询中使用 CTE。
    • @Edward 我建议提出一个显示您的代码的新问题,社区会提出建议!
    • 不需要你的第一句话就说明一切。 CTE 比临时更临时。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-02-07
    • 1970-01-01
    • 2014-08-03
    • 1970-01-01
    • 2022-01-21
    • 2011-11-08
    相关资源
    最近更新 更多