【问题标题】:How to use a dynamic WHERE clause in my SQL CTE query?如何在我的 SQL CTE 查询中使用动态 WHERE 子句?
【发布时间】:2020-04-22 18:33:34
【问题描述】:

我有一个关于我的 SQL CTE 构造的问题。我正在使用 Azure 数据工厂和数据库中的存储过程。我想做的是:

  1. 以 JSON 格式将我的数据从我的视图返回到 Azure 数据工厂。
  2. 根据我的视图中的我的 ObjectCode 以 JSON 格式返回在 WHERE 子句中动态过滤的数据。 -> 为了测试第 2 步,我尝试使用静态声明的 ObjectCode

但是单引号在 WHERE 子句中不起作用。我用 REPLACE、CHAR(39) 和双引号尝试了一些东西。就像他们说的hereherehere

第 1 步我已成功完成以下代码:

BEGIN

            DECLARE @TABLE TABLE(RESULT NVARCHAR(MAX))
            DECLARE @QUERY NVARCHAR(MAX) = '

            ;WITH x(Params) as 
            (
            SELECT * FROM [Schema].[View] FOR JSON PATH, WITHOUT_ARRAY_WRAPPER
            )
            Select * from x  
            '
            Insert @TABLE
            EXEC (@QUERY)

            Select ',"pipelineParameters": ' + LEFT(RESULT,LEN(RESULT)-1) + '}' as Params from @TABLE;


        END

上面的这个查询给了我正确的结果。但是,现在我需要对 Step 2 进行更改。我需要在查询中使用 WHERE 子句进行过滤。

所以,我尝试了:

DECLARE @TABLE TABLE(RESULT NVARCHAR(MAX))
            DECLARE @ObjectCode NVARCHAR(MAX) = 'Objectname'
            DECLARE @QUERY NVARCHAR(MAX) = '

            ;WITH x(Params) as 
            (
            SELECT * FROM [Schema].[View] 
            WHERE Objectcode = REPLACE(@ObjectCode, '''', '')
            FOR JSON PATH, WITHOUT_ARRAY_WRAPPER
            )
            Select * from x  
            '
            Insert @TABLE
            EXEC (@QUERY)
            Select ',"pipelineParameters": ' + LEFT(RESULT,LEN(RESULT)-1) + '}' as Params from @TABLE;

但是当我运行这些查询时,我得到了这个错误:

有谁知道我可以在这里改进什么以便让它发挥作用?

【问题讨论】:

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


【解决方案1】:

这是你想要的吗?

Insert @TABLE
    exec sp_executesql @QUERY, N'@ObjectCode nvarchar(max)', @ObjectCode=@ObjectCode;

正如所写的,由于这个WHERE 子句,我预计在运行查询时会出现语法错误:

WHERE Objectcode = REPLACE(@ObjectCode, '', ')

我想你打算:

DECLARE @QUERY NVARCHAR(MAX) = '
WITH x(Params) as  (
      SELECT *
      FROM [Schema].[View] 
      WHERE Objectcode = REPLACE(@ObjectCode, '''''''', '''')
      FOR JSON PATH, WITHOUT_ARRAY_WRAPPER
     )
Select * 
from x';

在动态 SQL 中引用事物总是冗长的。你可以打印出@Query,看看是否真的是你想要的。

'

【讨论】:

    【解决方案2】:

    谢谢 Gordon,第一个对我有用:

    Insert @TABLE
        exec sp_executesql @QUERY, N'@ObjectCode nvarchar(max)', @ObjectCode=@ObjectCode;
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2019-08-08
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2010-12-27
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多