【问题标题】:Easy way to pull fully qualified field names from a SELECT statement?从 SELECT 语句中提取完全限定字段名称的简单方法?
【发布时间】:2022-01-21 08:39:12
【问题描述】:

在 SQL Server 中,是否有一种简单的方法可以从 SELECT 语句中输出完全限定的字段名称列表,即使使用别名也是如此?

例如:

SELECT
      a.FieldName1
    , a.FieldName2
    , CASE WHEN a.FieldName9 = 'A' and b.FieldName10 = 'C' Then 'Yes' Else 'No' END as AliasedCase
FROM DatabaseA.dbo.Table1 a
JOIN DatabaseB.dbo.Table2 b on a.FieldName4 = b.FieldName4
WHERE b.FieldName8 Between 1 and 4

输出列表如下所示:

  1. DatabaseA.dbo.Table1.FieldName1
  2. DatabaseA.dbo.Table1.FieldName2
  3. DatabaseA.dbo.Table1.FieldName4
  4. DatabaseA.dbo.Table1.FieldName9
  5. DatabaseB.dbo.Table2.FieldName4
  6. DatabaseB.dbo.Table2.FieldName8
  7. DatabaseB.dbo.Table2.FieldName10

【问题讨论】:

标签: sql sql-server tsql


【解决方案1】:

您可以使用该SELECT 创建视图或过程,使用sys.dm_sql_referenced_entities 函数获取信息,然后将其删除。

create view dbo.MyTempView
as

SELECT
      a.FieldName1
    , a.FieldName2
    , CASE WHEN a.FieldName9 = 'A' and b.FieldName10 = 'C' Then 'Yes' Else 'No' END as AliasedCase
FROM DatabaseA.dbo.Table1 a
JOIN DatabaseB.dbo.Table2 b on a.FieldName4 = b.FieldName4
WHERE b.FieldName8 Between 1 and 4
select CONCAT(
  dep.referenced_server_name + '.',
  dep.referenced_database_name + '.',
  dep.referenced_schema_name + '.',
  dep.referenced_entity_name + '.',
  dep.referenced_minor_name)
from sys.dm_sql_referenced_entities('dbo.MyTempView', 'OBJECT') dep
where dep.referenced_minor_name is not null;
drop view dbo.MyTempView;

CONCAT+ '.' 一起使用意味着空值及其关联的. 将被忽略,因此它只会告诉您您使用的实际引用,它无法确定哪个数据库或架构是如果您未指定,则使用它(由于范围问题,因为它取决于执行时的默认数据库和架构)。

【讨论】:

    【解决方案2】:

    尝试如下:

    SELECT 
        c.object_id,
        o.name AS ObjName,
        c.name FieldName,
        c.column_id,
        c.system_type_id,
        c.user_type_id,
        c.max_length,
        c.precision,
        c.scale,
        c.collation_name,
        c.is_nullable,
        c.is_ansi_padded,
        c.is_rowguidcol,
        c.is_identity,
        c.is_computed,
        c.is_filestream,
        c.is_replicated,
        c.is_non_sql_subscribed,
        c.is_merge_published,
        c.is_dts_replicated,
        c.is_xml_document,
        c.xml_collection_id,
        c.default_object_id,
        c.rule_object_id,
        c.is_sparse,
        c.is_column_set,
        c.generated_always_type,
        c.generated_always_type_desc,
        c.encryption_type,
        c.encryption_type_desc,
        c.encryption_algorithm_name,
        c.column_encryption_key_id,
        c.column_encryption_key_database_name,
        c.is_hidden,
        c.is_masked,
        c.graph_type,
        c.graph_type_desc , 
        o.object_id,
        o.principal_id,
        o.schema_id,
        o.parent_object_id,
        o.type,
        o.type_desc,
        o.create_date,
        o.modify_date,
        o.is_ms_shipped,
        o.is_published,
        o.is_schema_published 
    FROM 
        sys.all_columns c 
    INNER JOIN 
        sys.all_objects o ON o.object_id = c.object_id
    

    通过该查询,您可以获得所有具有数据库列名的表和其他对象。然后就可以随意过滤了。

    【讨论】:

    • 这没有回答“这个特定查询使用哪些列”的问题。
    猜你喜欢
    • 2021-09-13
    • 2012-08-08
    • 1970-01-01
    • 2022-06-15
    • 2013-05-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-02-23
    相关资源
    最近更新 更多