一个参数中的多值

时间:2015-09-01 09:21:47

标签: sql-server tsql

CREATE FUNCTION [dbo].[func_1]
(
    @ListNum AS nvarchar(MAX)
)
 RETURNS @t TABLE
(
  col_1 nvarchar(MAX)
) 
AS
BEGIN
INSERT @t

SELECT col_1
FROM table_name
WHERE col_2 IN (@ListNum)

RETURN
END

当我只在parapater中传递一个值时(例如:1),函数正常工作,但我如何传递多个值(例如:1,2,3,4,5)。我收到以下错误:

Procedure execution failed
42000 - [SQL Server]Error converting data type nvarchar to bigint.  

有一种简单的方法可以解决这个问题吗?

2 个答案:

答案 0 :(得分:0)

嗨,你可以尝试这样,

CREATE FUNCTION Splitstring (@Input     NVARCHAR(MAX),
                             @Character CHAR(1))
RETURNS @Output TABLE (
  Item NVARCHAR(1000))
AS
  BEGIN
      DECLARE @StartIndex INT,
              @EndIndex   INT

      SET @StartIndex = 1

      IF Substring(@Input, Len(@Input) - 1, Len(@Input)) <> @Character
        BEGIN
            SET @Input = @Input + @Character
        END

      WHILE Charindex(@Character, @Input) > 0
        BEGIN
            SET @EndIndex = Charindex(@Character, @Input)

            INSERT INTO @Output
                        (Item)
            SELECT Substring(@Input, @StartIndex, @EndIndex - 1)

            SET @Input = Substring(@Input, @EndIndex + 1, Len(@Input))
        END

      RETURN
  END

GO

CREATE FUNCTION [dbo].[Func_1] (@ListNum AS NVARCHAR(MAX))
RETURNS @t TABLE (
  col_1 NVARCHAR(MAX))
AS
  BEGIN
      INSERT @t
      SELECT p.col1
      FROM   dbo.Splitstring(@ListNum, ',') s
             JOIN Table_Name t
               ON t.col2 = s.Item

      RETURN
  END

DECLARE @var VARCHAR(100)='1,2,3,4'

SELECT *
FROM   dbo.Func_1(@var) 

引入一个名为split string的函数。它将以逗号分隔的列表作为表返回。将逗号分隔表与实际表一起加入。这将给出结果。

答案 1 :(得分:0)

对于版本2008+,使用表分隔值可以帮助调用过程可以构建表,并且您可以创建表类型。如果必须在单个字符串中传递逗号(或其他字符分隔值),则需要将逗号分隔的字符串分隔为自己的结果集。

当您的字符串不包含任何特殊的XML字符(如尖括号&lt;&gt;)时,XML方法很有效。 - how-to-split-a-comma-separated-value-to-columns

我认为这适用于您的调整后的功能;

LMO.PDF