Почему OBJECT_ID (NVARCHAR) SQL Server не принимает переменную?

#sql #sql-server #sql-server-2008

#sql #sql-server #sql-server-2008

Вопрос:

Так почему это не работает?

 <!-- language: lang-sql -->
    DECLARE @tn NVARCHAR
    SET @tn = 'MyTable'
    SELECT OBJECT_ID(@tn)
  

Когда это делает:

 <!-- language: lang-sql -->
    SELECT OBJECT_ID('MyTable')
  

Мне нужно передать переменную в эту функцию.

Ответ №1:

Это так.

 declare @name sysname = N'sys.objects';
select object_id(@name);


-----------
-385

(1 row(s) affected)
  

В вашем примере вы объявляете переменную длиной 1 (поскольку вы опускаете длину). OBJECT_ID(N'M') ничего не находит и возвращает NULL.

Когда n не указано в определении данных или инструкции объявления переменной, длина по умолчанию равна 1. Когда n не указано с помощью функции приведения, длина по умолчанию равна 30.

Комментарии:

1. Что ж, я вижу ответ… но, как вы можете видеть, проблема заключалась в объявлении переменной как NVARCHAR вместо имени системы.

2. @davesbrain: sysname — это просто nvarchar с некоторыми другими элементами. А именно, заданную длину и, iirc, ненулеваемость. msdn.microsoft.com/en-us/library/ms191240.aspx

Ответ №2:

Ваша проблема в том, что вам не хватает размера на вашем NVARCHAR .

Это работает:

 DECLARE @tn NVARCHAR(20)
SET @tn = 'MyTable'
SELECT OBJECT_ID(@tn)