如何在我的 SQL CTE 查询中使用动态 WHERE 子句?
How to use a dynamic WHERE clause in my SQL CTE query?
我对我的 SQL CTE 构造有疑问。我在我的数据库中使用 Azure 数据工厂和存储过程。我想做的是:
- Return 我的数据以 JSON 格式从我的视图传输到 Azure 数据工厂。
- 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;
我对我的 SQL CTE 构造有疑问。我在我的数据库中使用 Azure 数据工厂和存储过程。我想做的是:
- Return 我的数据以 JSON 格式从我的视图传输到 Azure 数据工厂。
- 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;