Использование имени базы данных внутри сценария sql для полного имени таблицы - PullRequest
3 голосов
/ 07 ноября 2011

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

Существует ли ситуация, в которой использование имени базы данных как части полного имени таблицы ( имя базы данных + имя схемы + имя таблицы ) может быть оправдано (при условии, что мы не затрагиваем таблицы в других базах данных) или это всегда плохая практика? Как правильно использовать имя базы данных в сценариях sql, чтобы сохранить нейтральный код для конкретной базы данных?

Код только для иллюстрации:

CREATE PROCEDURE [dbo].[MyProc] 
AS
BEGIN
 DELETE FROM [MyDatabase].[dbo].[MyTable] 
END

Ответы [ 3 ]

2 голосов
/ 07 ноября 2011

Нет, вы не должны использовать имена баз данных в хранимой процедуре, если вам не нужно обращаться к двум базам данных.

Это вызывает именно те ошибки, которые вы видите. При изменении имени базы данных весь ваш код SP ломается или продолжает работать, но в старой базе данных.

Имеет смысл, если вы отправляете запрос SQL в базу данных, но только если приложение динамически выбирает имя базы данных для вставки в запрос.

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

0 голосов
/ 07 ноября 2011

Можно смешивать таблицы доверенных баз данных в одном запросе. Когда кто-то делает это, оправданно и обязательно включать базу данных в таблицу «путь».

Я не нашел причину этого сценария, если хранимая процедура и таблица находятся в одной базе данных.

Вы можете искать все вхождения базы данных по каталогу базы данных, чтобы исправить вашу разработку. Для SQL Server 2005:

SELECT Name
FROM sys.procedures
WHERE OBJECT_DEFINITION(OBJECT_ID) LIKE '%databasename%'
GO

Для SQL Server 2000:

SELECT DISTINCT so.name
FROM syscomments sc
INNER JOIN sysobjects so ON sc.id=so.id
WHERE sc.TEXT LIKE '%databasename%'
GO
0 голосов
/ 07 ноября 2011

Это действительно зависит от того, как реализованы ваши скрипты. Даже если вы не называете таблицу

[MyDatabase].[dbo].[MyTable]

вам все равно нужно будет обратиться к базе данных по:

USE [MyDatabase]

ранее в скрипте.

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