2010-07-26 42 views
1

所以這裏是設置。我有兩個表格:SQL光標/人口問題

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使用遊標循環和每一列中插入所謂的「查找」的另一個表,這樣的話這些名稱將有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對於其他任何東西都完全正確嗎?你們能證實這一點嗎?

+0

您提供的INSERT不起作用 - 語法錯誤,請參閱Florian的答案。 – 2010-07-26 19:58:11

回答

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' 

有很多在這裏所做的假設 - 例如,在相同的說明其他查詢費已經不存在。

在這裏,你的SQL語法和你的策略似乎有很多問題。如果這是一個生產系統,我強烈建議你找一個SQL開發人員,他知道他正在做什麼來處理這些事情。

+0

所有檢查都已完成。這是一位老開發人員的編碼錯誤。 – Scott 2010-07-26 20:07:46

2

爲什麼地球上你會用光標做到這一點?

http://wiki.lessthandot.com/index.php/Cursors_and_How_to_Avoid_Them

+0

爲什麼地球上仍然沒有標記爲已被棄用的遊標...... – 2010-07-26 19:55:42

+1

@Florian Reischl:遊標確實有用;海事組織的問題是程序員/程序員來到SQL,沒有意識到他們在一個基於SET的土地。 – 2010-07-26 19:57:06

+0

@OMG小馬:多年以來沒有看到遊標的任何理由。除了管理任務或代碼生成。 – 2010-07-26 20:05:10

1

不需要光標。

關於第一個問題(插入TmpFeesToRules1)

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

對於第二個問題(插入查找):

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

對於第三個問題,是有在查找或任何主鍵TmpFeesToRules1?

+0

是的,在查找中有一個主鍵,但不是TmpFeesToRules1 – Scott 2010-07-26 19:59:22

+0

剛剛意識到,在插入查找時沒有WHERE子句。只需使用「更新TmpFeesToRules1 SET AnyColumn = 1」 – 2010-07-26 20:03:45