SQL Server更新字段中串联字符串的字段

时间:2016-10-17 15:31:45

标签: sql sql-server concatenation

我对写入数据库的SQL代码相当新。我一直试图自己编写这段代码,但我没有太多运气。特别是因为我真的不知道如何测试它而不实际写入数据库 我有一个包含5个UDF字段的数据库。 ' UDF1-UDF5&#39 ;.我工厂的操作员应该将条形码扫描到特定的条形码字段中,该字段将条形码分成五个字段(它们都是char(30)字段)。不幸的是,它们正在直接扫描到UDF1字段,因此整个条形码字符串都在一个字段中。 (我无法控制这个软件)我正在尝试编写一个解析数据库的脚本,将这些字段拆分为单独的变量并更新数据库。我可以使用一点帮助,因为我认为我需要动态SQL才能做到这一点而且我对此并不了解。这是关于该系统的更多信息。

条形码字段如下所示:

%2S12345%1%1%0%10%

其中'%'字符开始和结束条形码并连接字符。第一个UDF字段的第一个字符' 2'是一个校验位,总是一样的。 第一个字段始终为5或6个字符(不包括校验位),其余字段为1或2位数。如果条形码只有前三个字段,我还需要不会破坏的代码。这里不是很多一致性。一些条形码被截断。

的问题,

  1. 据我所知,拆分连接文本的唯一方法是substring(),这是基于位置的,所以我需要额外的5个变量来获取每个字段的长度以及查询该方法的方法信息。有更简单的方法吗?

  2. 在某些时候我必须有条件地设置变量,我似乎无法使设置命令起作用。我理解为什么这样的事情不起作用,但我不知道其他任何方式。

  3.  DECLARE @BASEID CHAR(30), @LOTID CHAR(30), @SPLITID CHAR(30), @SUBID CHAR(30), @SEQUENCENO CHAR(30), @BASELEN INT
     SET @BASELEN =
        CASE WHEN(
            SELECT ISNUMERIC(SUBSTRING(R.UDF1,3,1))
            FROM VISION17SLITTER.DBO.ROLLINFO R 
            WHERE R.UDF1 LIKE '[%]%'
            ) = 1
            THEN 5
            ELSE 6
        END
    

    3。一旦我能得到变量集,我就假设一个简单的条件更新语句可以工作,但如果在尝试这个之前我还应该知道其他任何事情,我会很感激你的建议。

    再次感谢,

2 个答案:

答案 0 :(得分:1)

请考虑以下事项:

Declare @YourTable table (ID int,BarCode varchar(100))
Insert Into @YourTable values
(1,'%2S12345%1%1%0%10%'),
(2,'%ABC1234%2%3%4%50%')

Select A.ID
      ,A.BarCode
      ,B.*
 From  @YourTable A
 Cross Apply (
                Select Pos1 = xDim.value('/x[1]','varchar(max)')
                      ,Pos2 = xDim.value('/x[2]','varchar(max)')
                      ,Pos3 = xDim.value('/x[3]','varchar(max)')
                      ,Pos4 = xDim.value('/x[4]','varchar(max)')
                      ,Pos5 = xDim.value('/x[5]','varchar(max)')
                      ,Pos6 = xDim.value('/x[6]','varchar(max)')
                      ,Pos7 = xDim.value('/x[7]','varchar(max)')
                      ,Pos8 = xDim.value('/x[8]','varchar(max)')
                      ,Pos9 = xDim.value('/x[9]','varchar(max)')
                 From (Select Cast('<x>' + Replace(A.BarCode,'%','</x><x>')+'</x>' as XML) as xDim) A

             ) B 

<强>返回

enter image description here

现在,您可能会注意到Pos1和Pos7是空白的。这是因为您的字符串以分隔符开头和结尾。如果你想这样定制CROSS APPLY:

Select Pos1 = xDim.value('/x[2]','varchar(max)')
      ,Pos2 = xDim.value('/x[3]','varchar(max)')
      ,Pos3 = xDim.value('/x[4]','varchar(max)')
      ,Pos4 = xDim.value('/x[5]','varchar(max)')
      ,Pos5 = xDim.value('/x[6]','varchar(max)')
 From (Select Cast('<x>' + Replace(A.BarCode,'%','</x><x>')+'</x>' as XML) as xDim) A

返回

enter image description here

答案 1 :(得分:1)

创建一个分割字符串的函数

var counter = 0;

然后删除前两个控制字符和最后一个控制字符,并像这样调用函数

CREATE FUNCTION [dbo].[fnSplitString] 
( 
    @string NVARCHAR(MAX), 
    @delimiter CHAR(1) 
) 
RETURNS @output TABLE(splitdata NVARCHAR(MAX) 
) 
BEGIN 
    DECLARE @start INT, @end INT 
    SELECT @start = 1, @end = CHARINDEX(@delimiter, @string) 
    WHILE @start < LEN(@string) + 1 BEGIN 
        IF @end = 0  
            SET @end = LEN(@string) + 1

        INSERT INTO @output (splitdata)  
        VALUES(SUBSTRING(@string, @start, @end - @start)) 
        SET @start = @end + 1 
        SET @end = CHARINDEX(@delimiter, @string, @start)

    END 
    RETURN 
END

该函数将返回一个包含以下值的表:

select * from dbo.fnSplitString('S12345%1%1%0%10','%')