简体   繁体   English

(@Variable)查询中的SQL

[英]SQL in (@Variable) query

I have the following code, the problem is that my variable list @LocationList is essentially a csv string. 我有以下代码,问题是我的变量列表@LocationList本质上是一个csv字符串。 When I use this as part of the where LocationID in (@LocationList) it says its not an int (LocationID is an int). 当我使用它作为(@LocationList)中LocationID的一部分时,它表示它不是一个int(LocationID是一个i​​nt)。 How can I get this csv string to be accepted by teh in clause? 如何让这个csv字符串被teh in子句接受?

Declare @LocationList varchar(1000)
Set @LocationList = '1,32'

select Locations from table where Where LocationID in (@LocationList)

The most efficient way to do this is with Dynamic SQL such as rt2800 mentions (with injection warnings by Michael Allen) 最有效的方法是使用动态SQL,例如rt2800提及(由迈克尔艾伦注射警告)

However you can make a function: 但是你可以做一个功能:

ALTER  FUNCTION [dbo].[CSVStringsToTable_fn] ( @array VARCHAR(8000) )
RETURNS @Table TABLE ( value VARCHAR(100) )
AS 
    BEGIN
        DECLARE @separator_position INTEGER,
            @array_value VARCHAR(8000)  

        SET @array = @array + ','

        WHILE PATINDEX('%,%', @array) <> 0 
            BEGIN
                SELECT  @separator_position = PATINDEX('%,%', @array)
                SELECT  @array_value = LEFT(@array, @separator_position - 1)

                INSERT  @Table
                VALUES  ( @array_value )

                SELECT  @array = STUFF(@array, 1, @separator_position, '')
            END
        RETURN
    END

and select from it: 并从中选择:

DECLARE @LocationList VARCHAR(1000)
SET @LocationList = '1,32'

SELECT  Locations 
FROM    table
WHERE   LocationID IN ( SELECT   *
                           FROM     dbo.CSVStringsToTable_fn(@LocationList) )

OR 要么

SELECT  Locations
FROM    table loc
        INNER JOIN dbo.CSVStringsToTable_fn(@LocationList) list
            ON list.value = loc.LocationID

Which is extremely helpful when you attempt to send a multi-value list from SSRS to a PROC. 当您尝试从SSRS向PROC发送多值列表时,这非常有用。

I often have this requirement, and SOMETIME , if you know very well the column you are searching on [the size/format/length], you can do a kind of REGEX. 我经常有这个要求, 有时 ,如果你很清楚你正在搜索的列[大小/格式/长度],你可以做一种REGEX。

Something like this : 像这样的东西:

  DECLARE @MyListOfLocation varchar(255)
  set @MyListOfLocation  = '|1|32|36|24|3|'

  Select LocationID 
  from  Table 
  where @MyListOfLocation like '%|' +  LocationID + '|%'

NOTE : the PIPE character is used to protect the query from returning any LocationID that contains a single character (the '1', for example). 注意 :PIPE字符用于保护查询不返回任何包含单个字符的LocationID(例如,“1”)。

Here is a complete working example : 这是一个完整的工作示例:

DECLARE @MyListOfLocation varchar(255)
set @MyListOfLocation  = '|1|11|21|'

SELECT LocationName
FROM (
        select '1' as LocationID, 'My Location 1' as LocationName
        union all
        select '11' as LocationID, 'My Location 11' as LocationName
        union all
        select '12' as LocationID, 'My Location 12' as LocationName
        union all
        select '13' as LocationID, 'My Location 13' as LocationName
        union all
        select '21' as LocationID, 'My Location 21' as LocationName
    ) as MySub
where @MyListOfLocation like '%|' + LocationID + '|%'

WARNING! 警告! This method is not Index friendly! 这种方法不友好!

If you want do add some IN(@MyListOfLocation) in all that, to leverage use of INDEXES, you can modify your script do to : 如果你想在所有这些中添加一些IN(@MyListOfLocation),为了利用INDEXES的使用,你可以修改你的脚本做到:

SELECT MyDATA.* 
FROM   HugeTableWithAnIndexOnLocationID as MyDATA 
WHERE  LocationID in (
      Select LocationID 
      from  Table 
      where @MyListOfLocation like '%|' +  LocationID + '|%')
declare @querytext Nvarchar(MAX)

set @querytext = 'select Locations from table where Where LocationID in (' + @LocationList + ');';

exec sp_executesql @querytext;

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM