При присвоении переменной, есть ли функциональная разница между 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
предпочтительным вариантом здесь, или это действительно имеет значение? Есть ли разница в производительности?