Присвоить результат из динамического SQL в параметре другому параметру

#sql #sql-server #dynamic-sql

#sql #sql-сервер #dynamic-sql

Вопрос:

Мне приходится создавать свой запрос динамически, во-первых, он получает maxlogid из журнала и добавляет его к имени временной таблицы. Затем он выполняет объединение, чтобы вернуть различные значения в строку.

Тем не менее, вывод строки я хочу иметь в параметре, чтобы позже я мог использовать его снова в динамическом sql-запросе.

Вот мой код;

 DECLARE @maxLogId VARCHAR(10)
SELECT @maxLogId = (SELECT Max(id) FROM dbo.tLog)   

DECLARE @PolicyTempTable VARCHAR(100)
SET @PolicyTempTable = '##tPols'   @maxLogId

DECLARE @emailParm NVARCHAR(1000) 
SET @emailParm = N'DECLARE @email VARCHAR(MAX)
SELECT COALESCE(@email '','' ,'''')   ''''''''''''   EMAIL   '''''''''''' 
FROM (SELECT DISTINCT EMAIL FROM '   @PolicyTempTable   ') d'

EXEC sp_executesql @emailParm
  

Результаты возвращаются следующим образом;

«abc@a.co.uk «,»»abc@b.co.uk «

Я хочу иметь возможность записать sp_executesql в отдельный параметр, чтобы я мог использовать для динамического запроса, как показано ниже;

 DECLARE @StrSQLEmail VARCHAR(8000)
SET @StrSQLEmail = 'SELECT * FROM OPENQUERY(ATOM,''Select * from ATOMS.EMAILS WHERE EMAIL IN ('   '' EXEC sp_executesql @emailParm   ''   ')'')'
  

Однако я не могу использовать sp_executesql в моем динамическом запросе.

Комментарии:

1. Какую СУБД вы используете? (Этот код зависит от продукта.)

2. @jarlh Почти наверняка SQL Server.

3. Да, SQL Server.

Ответ №1:

Вы можете использовать параметры с помощью sp_executesql

 DECLARE @emailParm NVARCHAR(1000) 
DECLARE @emailOut NVARCHAR(MAX)
SET @emailParm = N'SELECT COALESCE(@email '','' ,'''')   ''''''''''''   EMAIL   '''''''''''' 
FROM (SELECT DISTINCT EMAIL FROM '   @PolicyTempTable   ') d'

EXEC sp_executesql @emailParm, N'@email VARCHAR(1000) OUTPUT', @email = @emailOut OUTPUT
  

Затем вы можете создать свой второй динамический sql

 DECLARE @StrSQLEmail VARCHAR(8000)
SET @StrSQLEmail = 'SELECT * FROM OPENQUERY(ATOM,''Select * from ATOMS.EMAILS WHERE EMAIL IN ('   @emailOut   ')'')'