Ошибка SQL Server 2005 в одиночном кавычках - PullRequest
2 голосов
/ 20 апреля 2011

У меня есть SP, у которого есть nvarchar(max) параметр @p1.Это разделенный запятыми список кодов, например 100,200,300 и т. Д.

. Внутри SP я объявляю переменную @p2 nvarchar(max) и преобразую список @p1 в один список в кавычках

set @p2 = N'''' + replace(@p1,',',''',''') + ''''

Когда я "выбираю" @p2, это возвращает правильное значение '100', '200', '300'

Если я затем использую @p2 в подвыборке, например,

select x,y,z from table1 where id in (@p2) 

Я не получаю возвращенных строк?Если я изменю тот же SQL, чтобы использовать тот же строковый литерал, который я получил из предыдущего выбора, я получу строки в порядке?

Как я могу передать строку, содержащую список идентификаторов, заключенных в одинарные кавычки, в SP и использовать это в подвыборах?Я подробно это погуглил, и можно преобразовать список во временную таблицу внутри SP и использовать его, но мне нужно использовать список в кавычках, чтобы я мог использовать подсказку запроса OPTIMIZE FOR.

Ответы [ 3 ]

2 голосов
/ 20 апреля 2011

IN не работает со строками, разделенными запятыми, как вы ожидаете: это считается единственной строкой, а не неявным массивом значений.

id IN ('101,102,103') будет соответствовать, только если id является точной строкой '101,102,103', а не какой-либо из ее отдельных разделенных частей.

Вы должны реализовать TVF, который разбивает строку , возвращает набор ее членов и использует его следующим образом:

SELECT  *
FROM    table1
WHERE   id IN
        (
        SELECT  value
        FROM    tvf_split_string('101,102,103')
        )
1 голос
/ 20 апреля 2011

Как говорит Кассной, вы должны использовать функцию для разбиения строки. Вот тот, который я использую:

CREATE FUNCTION dbo.tvf_split_string
(
    @List nvarchar(2000),
    @SplitOn nvarchar(5)
)  
RETURNS @RtnValue table 
(
    Id int identity(1,1),
    Value nvarchar(100)
) 
AS  
BEGIN 
    while (Charindex(@SplitOn,@List)>0)
    begin
        insert into @RtnValue (value)
        select 
            Value = ltrim(rtrim(Substring(@List,1,Charindex(@SplitOn,@List)-1)))

        set @List = Substring(@List,Charindex(@SplitOn,@List)+len(@SplitOn),len(@List))
    end
    insert Into @RtnValue (Value)
    select Value = ltrim(rtrim(@List))

    return
END

И назовите это следующим образом:

ВЫБРАТЬ значение ИЗ dbo.tvf_split_string ( '101102103')

0 голосов
/ 20 апреля 2011

Один из вариантов - использовать выполнить

Execute('select x,y,z from #1 where id in (' + @p2 + ')')
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...