我正在尝试使用完全限定的名称来获取数据库中列的字符串表示形式。
因此,如果我有一个类似server.dbo.table.id
的值,它将返回id
。在C#中,您可以使用nameof
来完成我想做的事情。
有人知道等效的T-SQL函数吗?
答案 0 :(得分:0)
我不了解此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,则必须拆分完整的列名。
答案 1 :(得分:0)
这可能不是您想要的,但这是一种字符串方式。 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'
答案 2 :(得分:0)
是对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