У меня есть CustomQuery с текстом:
declare @TableName varchar(250)
declare tc cursor FOR
SELECT
s1.[Code] AS [Code]
FROM
[tbl_Service] AS s1
WHERE s1.[ServiceTypeCode] = 'Table'
AND s1.Code IN (:IncludedTablesString)
ORDER BY 1 ASC
open tc
while (1=1)
begin
fetch next FROM tc INTO @TableName
IF @@fetch_status = -1 break
IF @@fetch_status = -2 continue
print 'Start process ' + @TableName
...
...
...
print @TableName + ' was processed'
end
close tc
deallocate tc
Мне нужно в параметр :IncludedTablesString подставить набор строк - перечень имен таблиц, например
declare tc cursor FOR
SELECT
s1.[Code] AS [Code]
FROM
[tbl_Service] AS s1
WHERE s1.[ServiceTypeCode] = 'Table'
AND s1.Code IN ('tbl_Opportunity', 'tbl_Incident')
ORDER BY 1 ASC
список таблиц - входящий параметр переменной длины (от 0 до много))
Долго мучался, в конце концов решил парсить "прямо там":
declare @TableName varchar(250)
-- для парсинга IncludedTablesString start
declare @IncludedTablesStringTable TABLE (Code nvarchar(4000))
declare @input_str nvarchar(4000) = :IncludedTablesString
declare @delimeter nvarchar(1) = ','
declare @pos int = charindex(@delimeter,@input_str)
declare @IncludedTablesStringCode nvarchar(4000)
while (@pos != 0)
begin
SET @IncludedTablesStringCode = SUBSTRING(@input_str, 1, @pos-1)
INSERT INTO @TABLE (Code) VALUES(@IncludedTablesStringCode)
SET @input_str = SUBSTRING(@input_str, @pos+1, LEN(@input_str))
SET @pos = CHARINDEX(@delimeter,@input_str)
print @pos
end
-- для парсинга IncludedTablesString end
declare tc cursor FOR
SELECT
s1.[Code] AS [Code]
FROM
[tbl_Service] AS s1
WHERE s1.[ServiceTypeCode] = 'Table'
AND s1.Code IN (SELECT Code FROM @IncludedTablesStringTable)
ORDER BY 1 ASC
строка должна быть вида('значение,значение2,значение3,' без пробелов - а то тоже попадут и с запятой (или другим разделителем) на конце.
Есть у кого-нибудь другие варианты, кроме запуска запроса в цикле для каждого значения отдельно?