#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)