Sqlserver
 sql >> база данни >  >> RDS >> Sqlserver

Как да използвате OBJECT_ID() за кръстосани обекти от бази данни в SQL Server

Една разлика между 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 тогава може да сме получили различен резултат. В такива случаи би било лесно погрешно да се предположи, че резултатът е правилен, когато всъщност не е.


  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Връщане на списък с всички сървърни тригери в SQL Server

  2. Избор на процесор за SQL Server 2012

  3. Отложена издръжливост в SQL Server 2014

  4. Примери за преобразуване на „дата“ в „datetimeoffset“ в SQL Server (T-SQL)

  5. Някакъв начин за вмъкване или актуализиране на SQLBulkCopy, ако съществува?