2015-11-04 78 views
0

我做了這個功能,允許我在SQL Server中拆分單元格。SQL Server - 用'print @variable'創建或插入表格結果

DECLARE @LoopCounter INT = 1, @MaxId INT = 8000, @Hashtag nVarchar(max) ='' 

WHILE(@LoopCounter <= @MaxId) 
BEGIN 

SELECT @Hashtag = @Hashtag + ' ' + Item FROM dbo.Split(' ', (SELECT 
Hashtags_in_Tweet FROM TwitterSentiment WHERE Tweet_ID = @LoopCounter)); 

    SET @LoopCounter = @LoopCounter + 1 
END 

print @Hashtag 

我使用此代碼爲dbo.Split,這是我從一段時間以前張貼在這裏另外一個問題了:

create FUNCTION [dbo].[Split] (@sep VARCHAR(32), @s VARCHAR(MAX)) 
RETURNS TABLE 
AS 
RETURN 
(
    SELECT r.value('.','VARCHAR(MAX)') as Item 
    FROM (SELECT CONVERT(XML, N'<root><r>' + REPLACE(REPLACE(REPLACE(@s,'& ','&amp; '),'<','&lt;'), @sep, '</r><r>') + '</r></root>') as valxml) x 
    CROSS APPLY x.valxml.nodes('//root/r') AS RECORDS(r) 
) 

所以,當我在列Hashtags_in_Tweet一排「奶酪黨的樂趣」,它導致成

奶酪

樂趣

現在我想這些在一個表中插入Hashs(INT IDENTITY(1,1),VARCHAR(800))我已經創建。我follwing腳本試了一下:

DECLARE @LoopCounter INT = 1, @MaxId INT = 100, @Hashtag nVarchar(max) = '' 

WHILE(@LoopCounter <= @MaxId) 
BEGIN 

SELECT @Hashtag = @Hashtag + ' ' + Item FROM dbo.Split(' ', (SELECT  
Hashtags_in_Tweet FROM TwitterSentiment WHERE Tweet_ID = @LoopCounter)); 

    SET @LoopCounter = @LoopCounter + 1 

END 

insert INTO Hashs 
Values (@Hashtag) 

但是,把它們裝進一個行:

ID | Hashtag 
1 | Cheese Party fun 

雖然我其實是想:

ID | Hashtag 
1 | Cheese 
2 | Party 
3 | Fun 

任何解決這一問題的方法呢?

+0

請添加代碼'dbo.Split'以及 – ughai

+0

@ughai我將它 – DenStudent

+0

在一個字段中存儲逗號分隔值*是一個非常糟糕的設計。如果你創建了一個單獨的表,你不會有任何問題。無論如何,*代碼明確*創建一個單一的行。如果你不想要,只需使用'INSERT ... FROM dbo.Split ...',*和*刪除所有循環。 'WHERE Tweet_ID <= 100'將返回所有必需的行。這段代碼是從哪裏複製的? –

回答

3

你可以得到所有的人立刻像這樣:

SELECT ID, Item 
    , ROW_NUMBER() over(partition by ID order by Item) 
FROM TwitterSentiment 
Cross Apply dbo.Split(' ', Hashtags_in_Tweet) 
Where Tweet_ID <= @MaxId 
+0

謝謝!這在SQL服務器中完成了這項工作。但是,在SSIS中可能嗎?我用一個執行SQL腳本嘗試了它,但是看到dbo.Split作爲一個無效對象。或者我應該爲此提出一個新問題? – DenStudent

+0

您應該可能會創建一個新問題。在SSIS中,如果你在同一個數據庫上運行這個查詢,Split函數應該存在,它應該可以工作。你是否應該連接到正確的服務器和數據庫? –