12344-23s2 $ 4
我有一个从Feed
收到的值12344-23s2$4, 12344-23s2$5, 12344-23s2$6, 12344-23s2$7
所有上述值均以逗号分隔。
对于每个以逗号分隔的值,我只需要在 - (连字符)
之后选择正确的部分我尝试使用以下声明
right(ID, len(ID) - CHARINDEX('-', ID))
如果我只有一个值,我会得到正确的值..即23s2 $ 4。 但如果我有多个逗号分隔值,我将在第一个之后获得所有值 - 。
我想取每个逗号分隔的值,并且每个值我想只取正确的部分(连字符后)
答案 0 :(得分:1)
所以你已经解决了单一价值的问题 - 这是一个很好的一步。现在,列出单个值。一种方法是把它变成一张桌子。这是我使用的函数,它将逗号分隔的字符串转换为表格:
CREATE Function [dbo].[ParseStringList] (@StringArray nvarchar(max) )
Returns @tbl_string Table (ParsedString nvarchar(max)) As
BEGIN
DECLARE @end Int,
@start Int
SET @stringArray = @StringArray + ','
SET @start=1
SET @end=1
WHILE @end<Len(@StringArray)
BEGIN
SET @end = CharIndex(',', @StringArray, @end)
INSERT INTO @tbl_string
SELECT
Substring(@StringArray, @start, @end-@start)
SET @start=@end+1
SET @end = @end+1
END
RETURN
END
然后你从表格中选择:
Select ParsedString From dbo.ParseStringList(@StringArray)
所以从这里开始,您可以应用您的解决方案:
Select right(ParsedString, len(ParsedString) - CHARINDEX('-', ParsedString))
From dbo.ParseStringList(@StringArray)
答案 1 :(得分:1)
如果使用SQLBulkCopy,BULK INSERT或bcp导入它,则可以在导入时将CSV拆分为单独的列。然后你的SQL每列工作。
如果你不能这样做,那么将值拆分(见这里:Split function equivalent in T-SQL?)行。
现在您已将CSV(作为行或列)分开使用
REPLACE (MyValue, '12344-', '')
答案 2 :(得分:1)
您需要在存储过程中执行此操作。在存储过程中,您必须创建一个while循环并循环遍历该字段,直到您处理完所有逗号。
答案 3 :(得分:1)
通常,当您尝试执行此类操作时,您必须创建一个允许您根据分隔符拆分字符串的UDF。这篇文章相当不错:
You can also看看使用一些XML函数来做到这一点:
Declare @xml as xml,@str as varchar(100),@delimiter as varchar(10)
SET @str='12344-23s2$4, 12344-23s2$5, 12344-23s2$6, 12344-23s2$7'
SET @delimiter =','
SET @xml = cast(('<X>'+replace(@str,@delimiter ,'</X><X>')+'</X>') as xml)
SELECT right(N.value('.', 'varchar(16)'), len(N.value('.', 'varchar(16)')) - CHARINDEX('-', N.value('.', 'varchar(16)'))) as value FROM @xml.nodes('X') as T(N)