#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 ')'')'