SQL Server: получить varchar версию имени столбца - PullRequest
0 голосов
/ 28 февраля 2019

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

Так что, если бы у меня было значение типа server.dbo.table.id, оно вернуло бы id.В C # вы можете использовать nameof, чтобы делать именно то, что я хочу.

Кто-нибудь знает об эквивалентной функции T-SQL?

Ответы [ 3 ]

0 голосов
/ 28 февраля 2019

Это, вероятно, не то, что вы ищете, но это строковый способ.таблицы sys и информационная схема хороши для поиска большинства вещей.

declare @fullly_qualified nvarchar(1024) = 'server.database.schema.table.column'
select right(@fullly_qualified, charindex('.',reverse(@fullly_qualified))-1)
/*
 sys views and old dbo options for discovery, not functions though for columns
 information_schema.columns is one, as mentioned above, others below
 */

select c.name, t.name, s.name
from sys.tables t
inner join sys.columns c on c.object_id = t.object_id
inner join sys.schemas s on s.schema_id = t.schema_id
--or
select c.name column_name, o.name table_name, schema_name(o.uid) [schema] --schema_name funciton is only 2008 or later
from dbo.sysobjects o
inner join dbo.syscolumns c on c.id = o.id
where o.type = 'U'
0 голосов
/ 28 февраля 2019

ниже - это запрос с разрешением по большинству важных частей в запросе sys.columns.Я уверен, что есть несколько типов данных, которые я пропустил, просто сделал это из текущей базы данных, над которой я работаю.

select 
     c.name column_name
    ,type_name(c.user_type_id) type_name
    ,case 
        when type_name(c.user_type_id) in ('bit','int','bigint','datetime','datetime2','timestamp','date','text','ntext','uniqueidentifier','xml') 
            then type_name(c.user_type_id)
        when type_name(c.user_type_id) in ('char','nchar','varchar','nvarchar','varbinary','binary')
            then type_name(c.user_type_id) + '(' + iif(c.max_length = -1,'max',rtrim(c.max_length)) + ')'
        when type_name(c.user_type_id) in ('numeric','decimal') 
            then type_name(c.user_type_id) + '('+ rtrim(c.precision) + ',' +  rtrim(c.scale) + ')'
     end scripting_type_name
    ,c.max_length data_max_length
    ,c.object_id table_object_id-- the table object_id from sys.tables (alternatively 
    ,t.name table_name
    ,s.name schema_name
    ,@@servername + '.' + db_name() + '.' + s.name + '.' + t.name + '.' + c.name fifth_level_uncallable_in_sql --@@servername is sometimes inaccurate, serverproperty('MachineName') is direct and current.
from sys.columns c
inner join sys.tables t on t.object_id = c.object_id
inner join sys.schemas s on s.schema_id = t.schema_id

0 голосов
/ 28 февраля 2019

Я не понимаю «серверную» часть этого server.dbo.table.id.Вы подразумевали, что «сервер» - это имя базы данных?

Если вы можете указать полное имя в виде schema.table.column, например, dbo.table.id , тогда вы можете запросить информационные схемы в Sql Server, используя что-то вроде этого

declare @full_name varchar(128); 
set     @full_name = 'dbo.Table1.ID'

SELECT COLUMN_NAME
FROM   INFORMATION_SCHEMA.COLUMNS 
WHERE  TABLE_SCHEMA = PARSENAME(@full_name, 3)
AND    TABLE_NAME   = PARSENAME(@full_name, 2)
AND    COLUMN_NAME  = PARSENAME(@full_name, 1)

Если вы используете более старую версию Sql Server, вам придется разделить полное имя столбца.

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