Получение информации о столбцах из системы MS SQL Server - PullRequest
1 голос
/ 25 марта 2019

Когда я использую приведенный ниже оператор SQL для получения информации о столбце базы данных SQL Server. Я получаю больше столбцов, чем на самом деле, я полагаю, это из-за системных столбцов, которые там тоже есть.

SELECT 
    c.name Field, 
    t.name Type,
    c.Precision, 
    c.Scale,
    c.max_length,
    c.is_nullable,
    c.collation_name 
FROM 
    sys.columns c 
INNER JOIN 
    sys.types t ON t.system_type_id = c.system_type_id
WHERE 
    object_id = OBJECT_ID('SOPOrders') 

Вы увидите, что вышеупомянутый запрос производит десять памяток заказа, когда на самом деле их должно быть только то, что var char Я все еще хочу иметь возможность сообщить максимальную длину prevision dataype и нулевой коэффициент, так что не так с Приведенный выше запрос, пожалуйста.

enter image description here

Ответы [ 2 ]

2 голосов
/ 25 марта 2019

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

select * from sys.types t where t.user_type_id != t.system_type_id;

Другая возможная вещь - таблица имеет разреженный набор столбцов, но я могу ошибаться.

И, конечно, убедитесь, что вына самом деле запрашивают информацию о правильной таблице - всегда включайте квалификатор имени схемы вместе с именем объекта, например:

WHERE object_id=object_id('dbo.SOPOrders')

Невыполнение этого требования не приведет к дублированию, которое вы наблюдаете, но следите за нимсэкономит вам много времени, пытаясь выяснить причину периодических несоответствий, когда у вас будут объекты с одинаковыми именами в разных схемах.

1 голос
/ 25 марта 2019

Почему бы не использовать Information_Schema.COLUMNS вместо ??

SELECT * 
FROM INFORMATION_SCHEMA.COLUMNS 
WHERE TABLE_NAME = 'SOPOrders'

Или попробовать присоединиться к

ON c.user_type_id = t.user_type_id

вместо

ON t.system_type_id=c.system_type_id
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...