SQL游标/人口问题

时间:2010-07-26 19:49:04

标签: sql sql-server-2005 tsql

所以这是设置。我有两张桌子:

CREATE TABLE dbo.TmpFeesToRules1(Name varchar, LookupId int)
CREATE TABLE dbo.TempFeesToRules2(FeeId int, Name varchar)

我在已创建的数据库中有第三个名为“费用”的表。我想用'Fee'中的DISTINCT'Name'填充dbo.TmpFeesToRules1'Name'字段。我会这样做吗?

INSERT INTO dbo.TmpFeesToRules1(Name, LookupId)
VALUES (SELECT DISTINCT Name FROM Fee, 0)

然后我想使用游标循环遍历dbo.TmpFeesToRules1并将这些行中的每一行插入另一个名为“Lookup”的表中,这样这些名称就会将LookupId分配给它们:

DECLARE db_cursor CURSOR FOR  
SELECT Name 
FROM dbo.TmpFeesToRules1 

OPEN db_cursor   
FETCH NEXT FROM db_cursor INTO @Name   

WHILE @@FETCH_STATUS = 0   
BEGIN   
       INSERT INTO dbo.Lookup (LookupType, LookupDesc)
       VALUES ('FEE', @Name)

       FETCH NEXT FROM db_cursor INTO @name   
END   

CLOSE db_cursor

然后我想回到dbo.TmpFeesToRules1并更新它并为每个名称插入那些LookupId。我该怎么做?

另外,我认为我的SQL对其他一切都不完全正确吗?你能证实这个吗?

3 个答案:

答案 0 :(得分:2)

答案 1 :(得分:1)

不需要游标。

关于你的第一个问题(插入TmpFeesToRules1)

INSERT INTO dbo.TmpFeesToRules1(Name, LookupId)
SELECT DISTINCT Name, 0 FROM Fee

关于你的第二个问题(插入Lookup):

INSERT INTO Lookup (LookupType, LookupDesc)
SELECT 'FEE', Name
FROM dbo.TmpFeesToRules1

对于第三个问题,Lookup或TmpFeesToRules1中是否有任何主键?

答案 2 :(得分:1)

我不会使用游标,而是执行以下操作:

INSERT INTO dbo.TmpFeesToRules1 (name, LookupId)
SELECT DISTINCT name, 0 FROM Fee

INSERT INTO Lookup (LookupType, LookupDesc)
SELECT 'FEE', name FROM dbo.TmpFeesToRules1

UPDATE TFTR
SET
    LookupID = LU.id
FROM
    Lookup LU
INNER JOIN dbo.TmpFeesToRules1 TFTR ON
    TFTR.name = LU.LookupDesc
WHERE
    LU.LookupType = 'FEE'

这里做了很多假设 - 例如,具有相同描述的其他FEE查找尚不存在。

您的SQL语法和策略似乎存在很多问题。如果这是针对生产系统的,我强烈建议你找一个知道他正在做什么来处理这类事情的SQL开发人员。