Как использовать динамическое предложение c WHERE в моем запросе SQL CTE? - PullRequest
0 голосов
/ 22 апреля 2020

У меня вопрос по поводу моей конструкции SQL CTE. Я работаю с Azure фабрикой данных и хранимой процедурой в моей базе данных. Я хочу сделать следующее:

  1. Вернуть мои данные из моего представления в Azure Фабрику данных в формате JSON.
  2. Возвращает данные, отфильтрованные динамически в предложении WHERE на основе моего ObjectCode в моем представлении в формате JSON. -> Чтобы протестировать шаг 2, я попытался использовать статический объявленный ObjectCode

Но одинарная кавычка не работает прямо в предложении WHERE. Я попробовал кое-что с REPLACE, CHAR (39) и удвоил кавычки. Как они сказали здесь , здесь и здесь

Шаг 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;

Но когда я запускаю эти запросы, я получаю эту ошибку:

Query Error

Кто-нибудь знает, что я могу улучшить здесь, чтобы я мог заставить его работать?

Ответы [ 2 ]

0 голосов
/ 23 апреля 2020

Спасибо, Гордон, у меня работает первый:

Insert @TABLE
    exec sp_executesql @QUERY, N'@ObjectCode nvarchar(max)', @ObjectCode=@ObjectCode;
0 голосов
/ 22 апреля 2020

Делает ли это то, что вы хотите?

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';

Цитирование вещей в динамике c SQL всегда многословно. Вы можете распечатать @Query, чтобы увидеть, действительно ли это то, что вы намереваетесь.

'

...