2015-07-13 2 views
3

Как я могу получить фактический тип столбца или переменной в t-sql?T-SQL: Является ли переменная NVARCHAR (MAX)?

Я знаю о SQL_VARIANT_PROPERTY, но с треском проваливается для NVARCHAR(MAX):

DECLARE @foo1 NVARCHAR(10) = N'a' 
SELECT SQL_VARIANT_PROPERTY(@foo1, 'BaseType') --works fine 
DECLARE @foo2 NVARCHAR(MAX) = N'a' 
SELECT SQL_VARIANT_PROPERTY(@foo2, 'BaseType') --fails with an error: 
--Operand type clash: nvarchar(max) is incompatible with sql_variant 

Есть ли что-нибудь еще, что может сказать мне, если переменная содержит значение типа NVARCHAR(MAX)?

Некоторый фон:

Я работаю над процедурой, которая должна изменить порядок столбцов таблицы: Переименовать старую таблицу, создать новую, скопировать данные и падение старого. Чтобы сделать это, все индексы, представления, ограничения и т. Д. Необходимо воссоздать в новой таблице.

Я хочу, чтобы в этом автоматическом процессе ничего не терялось. Для этого я хотел бы скопировать большинство значений из соответствующих системных таблиц в общую временную таблицу и сравнить значения после переупорядочения. Теперь это работает отлично, но при попытке обнаружить тип nvarchar (max) -columns он не работает.

+2

Какая ошибка вы получаете? (Я знаю, что это такое, но это должно быть частью вопроса). – Kritner

+0

related: http://stackoverflow.com/questions/7969508/operand-type-clash – Kritner

+0

@ Kritner: добавлено сообщение об ошибке – Andreas

ответ

0

sql_variant не может хранить NVARCHAR (макс) и SQL_VARIANT делает поддержку строк

не будет хранить эти типы также

varchar(max) 
varbinary(max) 
nvarchar(max) 
xml 
text 

и т.д ...

вместо перейти к

nvarchar(4000) but not nvarchar(max). 
varchar(8000) but not varchar(max) 
+0

Я готов это сделать, но сначала мне нужно знать тип переменной. Это общий код, который получает значение из таблицы sys (sys.columns не содержит информации об этих столбцах) и должен хранить его в sql_variant.Но для того, чтобы сделать преобразование только для правильных столбцов, мне нужно знать тип. – Andreas

1

Andreas,

Если вы хотите узнать тип данных и длину столбца, вы можете использовать следующий код. Обратите внимание, что -1 используется там, где (max) указано в схеме. Добавить предложение WHERE для указания имени таблицы или столбца

SELECT  tb.name TableName, cl.name ColumnName 
      , cl.system_type_id, ty.name, cl.max_length 
FROM  sys.columns cl 
INNER JOIN sys.tables tb ON tb.object_id = cl.object_id 
INNER JOIN sys.types ty ON cl.system_type_id = ty.system_type_id 
ORDER BY cl.max_length 
Смежные вопросы