我对写入数据库的SQL代码相当新。我一直试图自己编写这段代码,但我没有太多运气。特别是因为我真的不知道如何测试它而不实际写入数据库 我有一个包含5个UDF字段的数据库。 ' UDF1-UDF5&#39 ;.我工厂的操作员应该将条形码扫描到特定的条形码字段中,该字段将条形码分成五个字段(它们都是char(30)字段)。不幸的是,它们正在直接扫描到UDF1字段,因此整个条形码字符串都在一个字段中。 (我无法控制这个软件)我正在尝试编写一个解析数据库的脚本,将这些字段拆分为单独的变量并更新数据库。我可以使用一点帮助,因为我认为我需要动态SQL才能做到这一点而且我对此并不了解。这是关于该系统的更多信息。
条形码字段如下所示:
%2S12345%1%1%0%10%
其中'%'字符开始和结束条形码并连接字符。第一个UDF字段的第一个字符' 2'是一个校验位,总是一样的。 第一个字段始终为5或6个字符(不包括校验位),其余字段为1或2位数。如果条形码只有前三个字段,我还需要不会破坏的代码。这里不是很多一致性。一些条形码被截断。
的问题,
据我所知,拆分连接文本的唯一方法是substring(),这是基于位置的,所以我需要额外的5个变量来获取每个字段的长度以及查询该方法的方法信息。有更简单的方法吗?
在某些时候我必须有条件地设置变量,我似乎无法使设置命令起作用。我理解为什么这样的事情不起作用,但我不知道其他任何方式。
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。一旦我能得到变量集,我就假设一个简单的条件更新语句可以工作,但如果在尝试这个之前我还应该知道其他任何事情,我会很感激你的建议。
再次感谢,
丹
答案 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
<强>返回强>
现在,您可能会注意到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
返回
答案 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','%')