Какой предпочтительнее SELECT или SET - PullRequest
0 голосов
/ 20 февраля 2020

При присвоении переменной, есть ли функциональная разница между set и select?

Я часто пишу сценарии, которые должны повторять процессы, и на каждой итерации я обновляю переменную со значением.

Например, продукт моей компании имеет несколько серверов, на каждом сервере у нас есть определенное количество баз данных, в которых находятся данные наших клиентов. Каждая база данных имеет от 5 до 50 клиентов. Таблица в первичной базе данных указывает, на какой из отдельных баз данных работает каждый клиент. Сегодня я обнаружил проблему с первичным ключом в одной таблице, и нам нужно изменить первичный ключ, чтобы добавить к нему столбец. Таблица в каждой базе данных может содержать несколько сотен тысяч записей, поэтому мы ожидаем, что обновления займут некоторое время. Мы должны сделать это в одночасье, чтобы избежать проблем с производительностью. Итак, я написал следующий скрипт для итерации процесса в каждой базе данных (я буду выполнять его отдельно на каждом сервере):

DECLARE @DBTABLE TABLE
(
    TableID                 INT IDENTITY PRIMARY KEY NOT NULL,
    DbName                  VARCHAR(50) NOT NULL,
    ServerName              VARCHAR(50) NOT NULL,
    ProcFlag                INT NOT NULL DEFAULT 0
)

INSERT INTO @DBTABLE (DbName, ServerName)
SELECT      DISTINCT DbName, ServerName
FROM        PrimaryDatabase.dbo.Cients WITH(NOLOCK)
WHERE       ClientInactive = 0
    AND     ServerName = @@SERVERNAME

DECLARE     @TABLETEST  INT
DECLARE     @TABLEID    INT
DECLARE     @DBNAME     VARCHAR(50)
DECLARE     @SERVERNAME VARCHAR(50)
DECLARE     @VAR_SQL    VARCHAR(MAX)

SET     @TABLETEST = (SELECT COUNT(*) FROM @DBTABLE WHERE ProcFlag = 0)
WHILE   @TABLETEST > 0
BEGIN
    SET     @TABLEID =      (SELECT MIN(TableID) FROM @DBTABLE WHERE ProcFlag = 0)
    SET     @DBNAME =       (SELECT DbName FROM @DBTABLE WHERE TableID = @TABLEID)
    SET     @SERVERNAME =   (SELECT ServerName FROM @DBTABLE WHERE TableID = @TABLEID)

    SET     @VAR_SQL = '

        ALTER TABLE ' + @DBNAME + '.dbo.ClientDealTable DROP CONSTRAINT [PK_ClientDealTable]
        ALTER TABLE ' + @DBNAME + '.dbo.ClientDealTable ADD CONSTRAINT [PK_ClientDealTable] PRIMARY KEY CLUSTERED ([ClientID] ASC, [DealNumber] ASC, [DealDate] ASC)
    '

    EXEC(@VAR_SQL)

    UPDATE      @DBTABLE SET ProcFlag = 1 WHERE TableID = @TABLEID
    SET         @TABLETEST = (SELECT COUNT(*) FROM @DBTABLE WHERE ProcFlag = 0)

END

Является ли SET или SELECT предпочтительным вариантом здесь, или это действительно имеет значение? Есть ли разница в производительности?

1 Ответ

3 голосов
/ 20 февраля 2020

SET может устанавливать только значение одной переменной. используя SELECT, вы можете установить значение любого числа переменных.

Но в вашем коде я бы тоже не использовал. Я бы сделал это без зацикливания. Не говоря уже о том, что кода для написания гораздо меньше. Это должно сделать то же самое и намного проще.

DECLARE @VAR_SQL VARCHAR(MAX)

SELECT @VAR_SQL = 'ALTER TABLE ' + QUOTENAME(DbName) + '.dbo.ClientDealTable DROP CONSTRAINT [PK_ClientDealTable];ALTER TABLE ' + QUOTENAME(DbName) + '.dbo.ClientDealTable ADD CONSTRAINT [PK_ClientDealTable] PRIMARY KEY CLUSTERED ([ClientID] ASC, [DealNumber] ASC, [DealDate] ASC)'
FROM PrimaryDatabase.dbo.Cients --WITH(NOLOCK)
WHERE ClientInactive = 0
    AND ServerName = @@SERVERNAME

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