如何在我的 SQL CTE 查询中使用动态 WHERE 子句?

How to use a dynamic WHERE clause in my SQL CTE query?

我对我的 SQL CTE 构造有疑问。我在我的数据库中使用 Azure 数据工厂和存储过程。我想做的是:

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

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

第 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

上面的查询给了我正确的结果。但是,现在我需要对 步骤 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;

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

有谁知道我可以在这里改进什么以便让它正常工作?

这是你想要的吗?

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看看是不是真的如你所愿

'

谢谢戈登,第一个对我有用:

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