В настоящее время у меня есть связанный сервер, который я запрашиваю в хранимой процедуре. У меня есть запрос, который работает нормально сейчас, однако этот запрос нужно будет изменить для каждой ветви кода, который у меня есть. Я хотел бы знать, что лучший метод для derrive имя базы данных, которую я вызываю в кросс-серверном запросе.Связанный серверный запрос/динамический SQL
Ex: Сервер A имеет ссылку на сервер B. Сервер A содержит 3 базы данных. SRV_A.DB1_DEV, SRV_A.DB2_Trunk, SRV_A.DB3_Prod Каждый связаны с их сервером B коллегой ... SRV_B.DB1_DEV, SRV_B.DB2_Trunk, SRV_B.DB3_Prod
Каждая база данных на сервере А имеет ту же хранимую процедуру. Единственное, что изменяется в sproc, - это выбор кросс-сервера. Так SRV_A.DB1_Dev есть выбор в sproc, который гласит:
SELECT foo FROM [SRV_B].[DB1_DEV].[foo_table] WHERE bar = 1
, а хранимая процедура на ветви ствола будет
SELECT foo FROM [SRV_B].[DB2_Trunk].[foo_table] WHERE bar = 1
Так как я хотел бы иметь проект VS, который будет развернут DB для каждой отмеченной ветви я хотел бы иметь возможность динамически заполнять имя базы данных. Решение, которое я придумал, что работает, чтобы использовать серию IF проверок с функцией CHARINDEX, а затем создать запрос с помощью динамического SQL, например:
DECLARE @dSql NVARCHAR(4000);
DECLARE @databaseName NVARCHAR(100) = DB_NAME();
DECLARE @tableName NVARCHAR(100);
IF SELECT CHARINDEX('Dev', @databaseName, 0)
SET @tableName = '[SRV_B].[DB1_DEV].[foo_table]
...Same if & set for Trunk
...Same if & set for Prod
SET @dSql = 'DECLARE @retID INT;SELECT foo FROM ' + @tableName
+ ' WHERE bar = 1';SET @retID = SELECT SCOPE_IDENTITY()'
EXEC(@dSQL);
я бы себе представить, есть лучшее решение, хотя, если кто-то может помочь мне с одним, он будет очень признателен. Если каким-то внешним выстрелом это лучший способ, дайте мне знать.
Спасибо, Джеймс
Удивительный, оба метода работали как Шарм. Я решил пойти с опцией B. Да, вопрос был опечаткой, я действительно использую 4 названия частей. Спасибо за отличное объяснение! – SSISPissesMeOff