我有以下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条记录。
干杯。 雅各
答案 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))