我正在尝试在SQL Server 2008中创建一个过程,该过程将临时表中的数据插入到现有的表中。我想我已经弄明白了,我只是遇到循环问题。我需要temp表中的行计数来确定循环何时完成。
我尝试过以两种不同的方式使用@@ ROWCOUNT;在WHILE语句中单独使用它,并创建一个变量,以便在第一个循环完成时尝试并保持该值(请参阅下面的代码)。
这些方法都没有奏效,现在我不知道该怎么做。在这种情况下是否可以使用@@ ROWCOUNT,还是有其他方法可以更好地工作?
CREATE PROCEDURE InsertData(@KeywordList varchar(max))
AS
BEGIN
--create temp table to hold words and weights
CREATE TABLE #tempKeywords(ID int NOT NULL, keyword varchar(10) NOT NULL);
DECLARE @K varchar(10), @Num int, @ID int
SET @KeywordList= LTRIM(RTRIM(@KeywordList))+ ','
SET @Num = CHARINDEX(',', @KeywordList, 1)
SET @ID = 0
--Parse varchar and split IDs by comma into temp table
IF REPLACE(@KeywordList, ',', '') <> ''
BEGIN
WHILE @Num > 0
BEGIN
SET @K= LTRIM(RTRIM(LEFT(@KeywordList, @Num - 1)))
SET @ID = @ID + 1
IF @K <> ''
BEGIN
INSERT INTO #tempKeywords VALUES (@ID, @K)
END
SET @KeywordList = RIGHT(@KeywordList, LEN(@KeywordList) - @Num)
SET @Num = CHARINDEX(',', @KeywordList, 1)
--rowcount of temp table
SET @rowcount = @@ROWCOUNT
END
END
--declaring variables for loop
DECLARE @count INT
DECLARE @t_name varchar(30)
DECLARE @key varchar(30)
DECLARE @key_weight DECIMAL(18,2)
--setting count to start from first keyword
SET @count = 2
--setting the topic name as the first row in temp table
SET @t_name = (Select keyword from #tempKeywords where ID = 1)
--loop to insert data from temp table into Keyword table
WHILE(@count < @rowcount)
BEGIN
SET @key = (SELECT keyword FROM #tempKeywords where ID = @count)
SET @key_weight = (SELECT keyword FROM #tempKeywords where ID = @count+2)
INSERT INTO Keyword(Topic_Name,Keyword,K_Weight)
VALUES(@t_name,@key,@key_weight)
SET @count= @count +2
END
--End stored procedure
END
答案 0 :(得分:1)
解决问题的第二部分:
INSERT INTO Keyword(Topic_Name,Keyword,K_Weight)
SELECT tk1.keyword, tk2.keyword, tk3.keyword
FROM
#tempKeywords tk1
cross join
#tempKeywords tk2
inner join
#tempKeywords tk3
on
tk2.ID = tk3.ID - 1
WHERE
tk1.ID = 1 AND
tk2.ID % 2 = 0
(此代码应该从--declaring variables for loop
评论开始替换当前脚本中的所有内容)
答案 1 :(得分:0)
你可以改变:
WHILE(@count < @rowcount)
到
WHILE(@count < (select count(*) from #tempKeywords))
但是像marc_s评论的那样,你应该能够在没有while循环的情况下做到这一点。
答案 2 :(得分:0)
我会考虑重新处理您的查询,看看您是否可以以基于集合的方式而不是逐行方式执行此操作。
我不确定我是否完全遵循您要实现的目标,但我很想看看ROW_NUMBER()函数来设置临时表的ID。与this answer中显示的递归CTE一起使用时,您可以获得每个非空修剪单词的ID。一个例子就像是;
DECLARE @KeywordList varchar(max) = 'TEST,WORD, ,,,LIST, SOME , WITH, SPACES'
CREATE TABLE #tempKeywords(ID int NOT NULL, keyword varchar(10) NOT NULL)
;WITH kws (ord, DataItem, Data) AS(
SELECT CAST(1 AS INT), LEFT(@KeywordList, CHARINDEX(',',@KeywordList+',')-1) ,
STUFF(@KeywordList, 1, CHARINDEX(',',@KeywordList+','), '')
union all
select ord + 1, LEFT(Data, CHARINDEX(',',Data+',')-1),
STUFF(Data, 1, CHARINDEX(',',Data+','), '')
from kws
where Data > ''
), trimKws(ord1, trimkw) AS (
SELECT ord, RTRIM(LTRIM(DataItem))
FROM kws
)
INSERT INTO #tempKeywords (ID, keyword)
SELECT ROW_NUMBER() OVER (ORDER BY ord1) as OrderedWithoutSpaces, trimkw
FROM trimKws WHERE trimkw <> ''
SELECT * FROM #tempKeywords
我不完全理解你试图通过查询的第二部分实现什么,但是你可以在此基础上进行构建以使其余部分工作。它看起来好像你可以在没有声明的情况下完成你的工作。