2017-09-14 34 views
1

基本上由于活服务器的限制,我不能使用文本文件,所以我需要在T-SQL代码中对数据进行硬编码。如何将分号分隔的长字符串存储到多列中?

所以首先我创建的字符串从文本文件是这样的:

("001122;Sale Item 1", "001123;Sale Item 23", "001124;Sale Item 24", ....) 

我有这样的表结构:

DECLARE @Product TABLE(ProductCode INT NOT NULL, Description nvarchar(100) NOT NULL) 

首先我需要存储代码和说明表中的变量。完成后,我可以轻松将其映射到物理表并更新记录。

我如何能实现类似于此:

insert into @Product(ProductCode, Description) 
values ("001122;Sale Item 1", "001123;Sale Item 23", "001124;Sale Item 24", ....) 
Code  Description 

001122  Sale Item1 
001123  Sale Item2 
001124  Sale Item3 
+1

你的产品代码为INT,但你必须前导零。如果您使用数据类型INT – plaidDK

+2

,那么它们将会丢失。如果您对数值进行硬编码,为什么不用手动插入它们?插入@Product(ProductCode,Description)值('001122','销售项目1'),('001123','销售项目23'),('001124','销售项目24') – plaidDK

+0

这似乎没有你的主要问题,而是你想要解决的一个奇怪的解决方法。解决你的主要问题不是更好吗? –

回答

0

我装箱样品给你,请检查该

declare @Questions varchar(100)= '"001122;Sale Item 1", "001123;Sale Item 23", "001124;Sale Item 24"' 

DECLARE @myXML AS XML = N'<H><r>' +Replace(@Questions, ',', '</r><r>') + '</r></H>' 
select @myXML 

;WITH cte 
AS (
    SELECT CAST(N'<H><r>' + Replace(Vals.id.value('.', 'NVARCHAR(50)') ,';' , '</r><r>') + '</r></H>' as XML) AS val 
    FROM @myXML.nodes('/H/r') AS Vals(id) 
) 

,mycte1 as ( 
SELECT distinct 
    Replace(S.a.value('(/H/r)[1]', 'NVARCHAR(50)') , '"', '') AS c1, 
    Replace(S.a.value('(/H/r)[2]', 'NVARCHAR(50)') , '"', '') AS c2 

FROM cte CROSS APPLY val.nodes('/H/r') S(a) 
) 

select * from mycte1 

输出将是

c1  c2 
001123 Sale Item 23 
001124 Sale Item 24 
001122 Sale Item 1 
1

如果你有固定的格式,像例子中,那么你可以达到所需的输出只需使用CHARINDEXSUBSTRING

SELECT 
    SUBSTRING(description, 0, CHARINDEX(';', DESCRIPTION, 0)) code, 
    SUBSTRING(description, CHARINDEX(';', DESCRIPTION, 0)+1, LEN(DESCRIPTION)) Description 
FROM @Product 

OUTPUT :

code  Description 
------------------------ 
001122  Sale Item 1 
001123  Sale Item 23 
001124  Sale Item 24 
+0

当我运行你的代码,然后我的输出是在一行不是多行。 – 3355307

0

这里,我们去伙计:

DECLARE @MyString nvarchar(max) = '"001122;Sale Item 1", "001123;Sale Item 23", "001124;Sale Item 24"'; 

DECLARE @delimiter1 nvarchar(1) 
     , @delimiter2 nvarchar(1) 
     , @Start1  int 
     , @End1   int 
     , @Length  int 
     , @cNEXTVALUE nvarchar(1000) 
     , @cNEXTVALUE2 nvarchar(1000) 
     , @StringLength int; 

DECLARE @Product TABLE ( 
         ProductCode int NOT NULL 
        , Description nvarchar(100) NOT NULL); 

SET @MyString = RTRIM(LTRIM(@MyString)); 
SET @MyString = REPLACE(@MyString, CHAR(13), ''); 
SET @MyString = REPLACE(@MyString, CHAR(10), ''); 

SET @delimiter1 = ';'; 
SET @delimiter2 = ','; 
SET @MyString = REPLACE(@MyString, '"', '')[email protected]; 
SET @StringLength = LEN(@MyString); 

SELECT @Start1 = 0 
    , @End1 = CHARINDEX(@delimiter1, @MyString, 1); 

SELECT @Length = @End1 - @Start1; 

WHILE @Length > 0 
    BEGIN 

     SET @cNEXTVALUE = SUBSTRING(@MyString, @Start1, @Length); 
     SET @Start1 = @End1 + 1; 

     SET @End1 = CHARINDEX(@delimiter2, @MyString, @Start1); 
     SELECT @Length = @End1 - @Start1; 

     SET @cNEXTVALUE2 = SUBSTRING(@MyString, @Start1, @Length); 

     IF LEN(RTRIM(LTRIM(@cNEXTVALUE))) > 0 
      BEGIN 
       INSERT INTO @Product 
         (ProductCode 
         , Description 
         ) 
       VALUES 
         (@cNEXTVALUE, @cNEXTVALUE2); 
      END; 

     SET @Start1 = @End1 + 2; 
     SET @End1 = CHARINDEX(@delimiter1, @MyString, @Start1); 
     SELECT @Length = @End1 - @Start1; 

    END; 

SELECT * 
    FROM @Product; 
相关问题