0

INを実行するために文字列を渡す必要がある状況があります

    declare @searchString varchar(50)
    set @searchString = ' ''Nestle'',''UFI'' '

    select * from tbl1 where CompanyName IN (@SearchString) 

動作しません。

しかし、私がそうする場合:

    select * from tbl1 where CompanyName IN ('Nestle','UFI')

正常に動作します。なぜ一方が機能し、もう一方が機能しないのか理解できません

4

5 に答える 5

1

INは、パラメータとして文字列ではなく、セットを検査します。

これを参照してください:

http://social.msdn.microsoft.com/forums/en-US/transactsql/thread/33108337-b7b4-4ada-a480-60673e175f4d/

于 2012-10-09T15:21:18.507 に答える
1

使用するINと、単一の文字列式ではなく、セットが表示されます。CsvToIntこのため、次のようにテーブルを返すなどの関数を実装する必要があります。

CREATE Function [dbo].[CsvToInt] ( @Array varchar(1000)) 
returns @IntTable table 
    (IntValue int)
--Parse comma seperated value parameters
--To be used in SELECT blah WHERE blah IN (...)
--This function returns int, but may be modified to return any datatype
AS
begin

    declare @separator char(1)
    set @separator = ','

    declare @separator_position int 
    declare @array_value varchar(1000) 

    set @array = @array + ','

    while patindex('%,%' , @array) <> 0 
    begin

      select @separator_position =  patindex('%,%' , @array)
      select @array_value = left(@array, @separator_position - 1)

        Insert @IntTable
        Values (Cast(@array_value as int))

      select @array = stuff(@array, 1, @separator_position, '')
    end

    return
end

そして、次のようにストアドプロシージャ内でこの関数を使用できます。

SELECT Blah
FROM MyTable
WHERE Foo IN (SELECT * FROM dbo.CsvToInt(@Parameter))

ここ@Parameterに、次のような値のコンマ区切りの文字列が含まれています。

Nestle, UFI, Test

于 2012-10-09T15:20:20.347 に答える
0

動作する例は、動作しない例と同じではありません。動作する例には、文字列のリストがあります。動作しない例は、単一の文字列です。これは、CompanyNameフィールドが文字列のコンマ区切り部分ではなく、文字列全体と等しい行を取得しようとしていることを意味します。

動作しない例は次のとおりです。

select * from tbl1 where CompanyName IN (' ''Nestle'',''UFI'' ')

次ではありません:

select * from tbl1 where CompanyName IN ('Nestle','UFI')
于 2012-10-09T15:19:07.733 に答える
0
declare @searchString varchar(50)
set @searchString = ' ''Nestle'',''UFI'' '

exec ('select * from tbl1 where CompanyName IN (' + @SearchString + ');')

これは動的SQLであり、時々眉をひそめ、最適化されないことに注意してください。ただし、これは単純であり、必要なものを取得できます。

于 2012-10-09T15:32:30.703 に答える
0
declare @searchString varchar(50)
set @searchString = 'Nestle,UFI'
set @searchString = ',' + @searchString + ','

select * from tbl1 where charindex(',' + CompanyName + ',',@SearchString) > 0 
于 2013-09-20T01:42:29.463 に答える