2016-06-01 54 views
1

我发送一个分隔字符串到'存储过程',最终将与IN语句一起使用来更新一些记录,所以我试图做的是创建一个'Table- Valued Function'将执行此转换并返回此更新语句中可用的表,但不确定如何执行此操作。将分隔字符串分解成临时表

有,打破了分隔字符串另一功能,但它不喜欢像它返回整个表,我真的不明白它的语法时才,它不是任何SQL我今天来之前翻过......

所以(生病发布下面的其他函数)我可以修改或使用此函数为这个分隔字符串中的任意数量的值或我需要想出另一种方法?

CREATE FUNCTION [dbo].[Split] 
(
    @String NVARCHAR(4000), 
    @Delimiter NCHAR(1) 
) 
RETURNS TABLE 
AS 
RETURN 
(
    WITH Split(stpos,endpos) 
    AS(
     SELECT 0 AS stpos, CHARINDEX(@Delimiter,@String) AS endpos 
     UNION ALL 
     SELECT endpos+1, CHARINDEX(@Delimiter,@String,endpos+1) 
      FROM Split 
      WHERE endpos > 0 
    ) 
    SELECT 'Id' = ROW_NUMBER() OVER (ORDER BY (SELECT 1)), 
     'Data' = SUBSTRING(@String,stpos,COALESCE(NULLIF(endpos,0),LEN(@String)+1)-stpos) 
    FROM Split 
) 

使用此功能时得到生病类似下面

语法每个项目
set @ID = (select Data from dbo.Split(@Params, '|') where ID = 1) 

*****使用结果从给定的答案更新*******

DECLARE @pVals VARCHAR(MAX) 

SET @pvals = '1,2,3,4,5' 

DECLARE @tblDelimitedData TABLE (
    [Data] INT NULL 
    ) 

INSERT INTO @tblDelimitedData(data) 
    SELECT data 
    FROM dbo.Split(@pvals, ',') s 
    WHERE ID >= 2 

SELECT * FROM @tblDelimitedData 

结果是2,3,4,5

完美谢谢!

+0

有一个类似的问题在链接[这里]解决(http://stackoverflow.com/questions/36793821/to-convert-a-string-into-table-with-schema)。希望这可以帮助。 –

+0

为什么不使用数据类型*设计*来存储多个值,如表值参数或XML,而不是将所有内容填充到一个字符串中,然后必须撤消它? –

+0

@Damian_The_Unbeliever,这将被称为从正在开发的东西,目前通过分隔字符串存储过程在服务器上,它的好和简单,老实说SQL对我来说是相当新的,所以即时imging以坚持什么工作如此远远所以我不会在服务器端弄乱一些东西:) –

回答

1

要插入功能到一个临时表的结果,你应该使用:

INSERT INTO #tempTable(data) 
SELECT data 
FROM dbo.Split(@Params, '|') s 
WHERE ID = 1 

使用WHERE ID = 1,但是,只有在插入的分隔列表中的第一项。如果要过滤,则要在表中插入的值的数量使用<=

例如,您只需要插入前三个值,那么你用:

WHERE ID <= 3 

此外,相比于其他一些可用的功能的功能分裂较慢。我建议您使用基于Tally的分离器,例如Jeff Moden的DelimitedSplit8K

+0

所以要插入所有的值后,我可以使用第一个值=> 2 .....第一个值将被用作更新的值也。 –

+0

@PaulS,是从第二个值开始插入,使用'ID> = 2'。 –

+0

啊是的抱歉> = 2 ...不= => :),我是一个VB程序员,你可以告诉哈哈。感谢有关DelimitedSplit8K的信息。我没有写出原来的,我接管这些世俗的SQL任务,所以SQL专家可以做更多的紧迫工作:/但它的乐趣:) –