Курсор SQL / Вопрос о населении - PullRequest
1 голос
/ 26 июля 2010

Итак, вот настройки. У меня есть две таблицы:

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

У меня есть третья таблица под названием «Плата» в базе данных, которая уже создана. Я хочу заполнить поле «Имя» dbo.TmpFeesToRules1 с DISTINCT «Имя» от «Плата». Буду ли я делать это так?

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 ]

2 голосов
/ 26 июля 2010

С какой стати вы делаете это курсором?

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

1 голос
/ 26 июля 2010

Вместо того, чтобы разбираться с курсорами, я бы просто сделал следующее:

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, который знает, что он делает для решения подобных задач.

1 голос
/ 26 июля 2010

Курсоры не нужны.

Для вашего первого вопроса (вставка в TmpFeesToRules1)

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

Для вашего второго вопроса (вставка в поиск):

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

Для вашего третьего вопроса, есть ли первичный ключ в Lookup или TmpFeesToRules1?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...