У меня есть хранимая процедура, которую я хочу сделать динамической, чтобы она могла обрабатывать различные входы. Я получил большую часть динамической процедуры, за исключением следующих.SQL Server: как вставить переменные в динамический Выберите
Может ли кто-нибудь сказать мне, как мне написать эту часть, чтобы использовать ее в динамической процедуре? Должен ли я просто поставить '+
до и +'
после каждой переменной?
INSERT INTO @temp
(
dateRange
)
SELECT @date0
UNION ALL
SELECT @date1
UNION ALL
SELECT @date2
UNION ALL
SELECT @date3
UNION ALL
SELECT @date4
UNION ALL
SELECT @date5
Edit: Весь запрос в FYI. Прежде чем я сделал эту динамику, она работала правильно, поэтому я предполагаю, что у меня есть некоторые недостающие или ненужные цитаты здесь или любая другая ошибка записи. Кроме того, я не уверен, что условия Where в последнем вложенном запросе написаны правильно, чтобы быть динамическими.
ALTER PROCEDURE [dbo].[FetchHistoryCombined]
@selection nvarchar(100),
@date0 nvarchar(20),
@date1 nvarchar(20),
@date2 nvarchar(20),
@date3 nvarchar(20),
@date4 nvarchar(20),
@date5 nvarchar(20)
AS
BEGIN
SET NOCOUNT ON;
BEGIN
DECLARE @sql nvarchar(max)
SET @sql = N' DECLARE @temp AS TABLE
(
dateRange nvarchar(20)
)
DECLARE @temp2 AS TABLE
(
ranking int,
item nvarchar(100),
volume int
)
INSERT INTO @temp
(
dateRange
)
SELECT ' + @date0 + '
UNION ALL
SELECT ' + @date1 + '
UNION ALL
SELECT ' + @date2 + '
UNION ALL
SELECT ' + @date3 + '
UNION ALL
SELECT ' + @date4 + '
UNION ALL
SELECT ' + @date5 + '
INSERT INTO @temp2
(
ranking,
item,
volume
)
SELECT Top 10 RANK() OVER(ORDER BY COUNT(*) desc, ' + @selection + ') [Rank],
' + @selection + ',
COUNT(*) AS volume
FROM LogEsc
WHERE dateEsc LIKE ''' + @date0 + '%''
AND EID LIKE ''PE%''
GROUP BY ' + @selection + '
ORDER BY volume desc, ' + @selection + '
SELECT
(
SELECT A.item
FROM @temp2 A
ORDER BY A.ranking, A.item
FOR XML PATH(''''), ELEMENTS, TYPE
) AS top10,
(
SELECT B.dateRange,
(
SELECT C.item,
(
SELECT COUNT(*) AS volume
FROM LogEsc D
WHERE D.' + @selection + ' = C.item
AND D.EID LIKE ''PE%''
AND D.dateEsc LIKE B.dateRange + ''%''
FOR XML PATH(''''), ELEMENTS, TYPE
)
FROM @temp2 C
ORDER BY C.ranking, C.item
FOR XML PATH(''''), ELEMENTS, TYPE
) AS [dateRange/items]
FROM @temp B
FOR XML PATH(''''), ELEMENTS, TYPE
) AS history
FOR XML PATH(''ranking''), ELEMENTS, TYPE, ROOT(''ranks'')'
EXEC(@sql)
END
END
Большое спасибо заранее, Майк.
Динамический SQL относится к помещению запросов в строки, а затем их выполнению. Ваш запрос не в строке. –
Спасибо. Это не весь запрос - это строка. Я просто не знаю, что делать с этой частью. – Mike
Я добавил весь запрос на случай, если это облегчит ответ. – Mike