Една разлика между OBJECT_ID()
и OBJECT_NAME()
в SQL Server е синтаксисът, използван за запитвания за кръстосани бази данни. Под това имам предвид, когато се използват върху обекти в различна база данни.
OBJECT_NAME()
функцията има незадължителен аргумент, който можете да предоставите, който определя идентификатора на базата данни на базата данни, която съдържа обекта, на който се опитвате да получите името. Предоставянето на този аргумент ви позволява да получите името на обект в различна база данни.
OBJECT_ID()
функция от друга страна, не изисква такъв аргумент. Вместо това тази функция ви позволява да използвате име от 3 части, за да посочите базата данни, схемата и името на обекта, за който се опитвате да получите идентификатора.
Тази статия съдържа примери за използване на OBJECT_ID()
за да получите името на обект от друга база данни.
Пример 1 – Основна заявка
Ето основен пример, за да демонстрирате как работи.
USE WideWorldImportersDW; SELECT OBJECT_ID('Music.dbo.Artists') AS Result;
Резултат:
+-----------+ | Result | |-----------| | 885578193 | +-----------+
Тук преминах към WideWorldImportersDW
база данни, след което поиска името на обект в Music
база данни.
Пример 2 – В сравнение с текущата база данни
По подразбиране SQL Server приема, че името на обекта е в контекста на текущата база данни. Така че, ако не използвате име от 3 части, за да посочите обект в друга база данни, SQL Server Database Engine ще търси само в текущата база данни.
Ето същия код от предишния пример, освен че този път включвам имена на 1 част и 2 части. Освен това стартирам кода два пъти:първия път, когато се стартира в Music
база данни, втория път се изпълнява в WideWorldImportersDW
база данни:
USE Music; SELECT OBJECT_ID('Artists') AS [1 Part Name], OBJECT_ID('dbo.Artists') AS [2 Part Name], OBJECT_ID('Music.dbo.Artists') AS [3 Part Name]; USE WideWorldImportersDW; SELECT OBJECT_ID('Artists') AS [1 Part Name], OBJECT_ID('dbo.Artists') AS [2 Part Name], OBJECT_ID('Music.dbo.Artists') AS [3 Part Name];
Резултат:
Changed database context to 'Music'. +---------------+---------------+---------------+ | 1 Part Name | 2 Part Name | 3 Part Name | |---------------+---------------+---------------| | 885578193 | 885578193 | 885578193 | +---------------+---------------+---------------+ (1 row affected) Changed database context to 'WideWorldImportersDW'. +---------------+---------------+---------------+ | 1 Part Name | 2 Part Name | 3 Part Name | |---------------+---------------+---------------| | NULL | NULL | 885578193 | +---------------+---------------+---------------+ (1 row affected)
В първия резултат и трите колони връщат правилния идентификатор. Това е така, защото текущата база данни е Music
, и това е мястото, където се намира обектът.
Във втория резултат само името на 3 части може да намери правилния обект. Това може да се очаква, тъй като имената на 1 част и 2 части не посочват името на базата данни, следователно се предполага, че обектът е в WideWorldImportersDW
(грешна) база данни.
Ако и двете бази данни имат обект с обхват на схема, наречен Artists
тогава може да сме получили различен резултат. В такива случаи би било лесно погрешно да се предположи, че резултатът е правилен, когато всъщност не е.