2017-09-14 64 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; 
相關問題