2015-11-04 2 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 с «партией весело сыра », это приводит к

Сыр

партия

Fun

Теперь я хочу, чтобы они были вставлены в таблицу 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-скрипта execute, но увидел dbo.Split как недопустимый объект. Или я должен задать новый вопрос? – DenStudent

+0

Возможно, вы должны создать новый вопрос. В SSIS, если вы запускаете этот запрос в той же базе данных, функция Split должна присутствовать, и она должна работать. Вы должны подключиться к правильному серверу и базе данных? –