根据一系列值过滤ID列

时间:2011-04-11 13:09:52

标签: tsql

我有以下SQL:

SELECT ',' + LTRIM(RTRIM(CAST(vessel_is_id as CHAR(2)))) + ',' AS 'Id'
FROM Vessels
WHERE ',' + LTRIM(RTRIM(CAST(vessel_is_id as varCHAR(2)))) + ',' IN (',1,2,3,4,5,6,')

基本上,我想针对整数值的变量列表(将其作为vessel_is_id传递到存储过程中)来过滤varchar。现在,上面的SQL不起作用。我的表中有一行'vessel__is_id'为1,但它们不会返回。

有人可以为我建议一个更好的方法吗?或者,如果上面的确定

编辑:

示例数据

| vessel_is_id |
| ------------ |
|      1       |
|      2       |
|      5       |
|      3       |
|      1       |
|      1       |

所以我想返回以上vessel_is_id在变量过滤器中的所有内容,即'1,3' - 应返回4条记录。

干杯。 雅各

2 个答案:

答案 0 :(得分:1)

IF OBJECT_ID(N'dbo.fn_ArrayToTable',N'FN') IS NOT NULL
    DROP FUNCTION [dbo].[fn_ArrayToTable]
GO
CREATE FUNCTION [dbo].fn_ArrayToTable (@array VARCHAR(MAX))
-- =============================================
-- Author:      Dan Andrews
-- Create date: 04/11/11
-- Description: String to Tabled-Valued Function
--
-- =============================================
RETURNS @output TABLE (data VARCHAR(256))
AS 
BEGIN

    DECLARE @pointer INT
    SET @pointer = CHARINDEX(',', @array)

    WHILE @pointer != 0
    BEGIN
        INSERT INTO @output
        SELECT RTRIM(LTRIM(LEFT(@array,@pointer-1)))

        SELECT  @array = RIGHT(@array, LEN(@array)-@pointer), 
                @pointer = CHARINDEX(',', @array)
    END

    RETURN
END

您可以申请:

SELECT * FROM dbo.fn_ArrayToTable('2,3,4,5,2,2')

,在你的情况下:

SELECT  LTRIM(RTRIM(CAST(vessel_is_id AS CHAR(2)))) AS 'Id'      
FROM Vessels      
WHERE    LTRIM(RTRIM(CAST(vessel_is_id AS VARCHAR(2)))) IN (SELECT data FROM dbo.fn_ArrayToTable('1,2,3,4,5,6')

答案 1 :(得分:0)

由于Sql server没有Array,您可能需要考虑将一组值作为XML类型传递。然后,您可以将XML类型转换为关系并加入其中。以经过时间考验的pubs数据库为例。当然,您的客户端可能会或者可能不会轻松地为参数值生成XML,但是这种方法对于sql-injection是安全的,大多数“逗号分隔”值的方法都不是。

declare @stateSelector xml
set @stateSelector = '<values>
<value>or</value>
<value>ut</value>
<value>tn</value>
</values>'

select * from authors 
where state in ( select c.value('.', 'varchar(2)') from @stateSelector.nodes('//value') as t(c))