AskOverflow.Dev

AskOverflow.Dev Logo AskOverflow.Dev Logo

AskOverflow.Dev Navigation

  • 主页
  • 系统&网络
  • Ubuntu
  • Unix
  • DBA
  • Computer
  • Coding
  • LangChain

Mobile menu

Close
  • 主页
  • 系统&网络
    • 最新
    • 热门
    • 标签
  • Ubuntu
    • 最新
    • 热门
    • 标签
  • Unix
    • 最新
    • 标签
  • DBA
    • 最新
    • 标签
  • Computer
    • 最新
    • 标签
  • Coding
    • 最新
    • 标签
主页 / dba / 问题 / 345593
Accepted
Mike S
Mike S
Asked: 2025-03-06 06:22:31 +0800 CST2025-03-06 06:22:31 +0800 CST 2025-03-06 06:22:31 +0800 CST

是否可以提取 SQL Server 存储过程中字段的公式或表达式?

  • 772

我有一个包含单个选择查询的存储过程。查询中有几个代表公式或表达式的别名。

是否有可能提取其中的计算/公式/表达式?

在下面的例子中,我希望提取类似以下内容的内容:

“s * 2” 表示 ScoreTimesTwo

“s * 5” 表示 ScoreTimesFive

ConditionalScore 的“CASE...”(整个 case 语句)

另外,我以这样的方式编写了查询来涵盖这样一个事实:字段/表达式可以以不同的方式(等于或“AS”)分配给别名,并且表达式可以位于同一行或多行上。

我试图使用 sys.dm_exec_describe_first_result_set,但它似乎只能识别直接引用的源列(即,当它们不是公式的一部分时),而不能识别公式本身,而这正是我需要的。

/* Drop and create the test score table */
DROP TABLE IF EXISTS Test_ScoreTable
GO

CREATE TABLE Test_ScoreTable(s INT)
GO

/* Insert sample data into the score table */
INSERT INTO Test_ScoreTable(s)
SELECT t.s
FROM   (VALUES (100), (50), (10)) t(s)
GO

/* Drop and create test score stored procedure */
DROP PROCEDURE IF EXISTS Test_ScoreStoredProcedure
GO

CREATE PROCEDURE Test_ScoreStoredProcedure
AS

SELECT Score = t.s,
       ScoreTimesTwo = t.s * 2,
       t.s * 5 AS ScoreTimesFive,
       ConditionalScore = CASE t.s
                            WHEN 100 THEN 'Good'
                            WHEN 10 THEN 'Bad'
                            ELSE 'Eh...'
                          END
FROM   Test_ScoreTable t

GO

/* Attempt to extract the calculations and expressions */
SELECT s.[name], s.source_column, s.is_computed_column, *
FROM   sys.dm_exec_describe_first_result_set('Test_ScoreStoredProcedure', NULL, 1) s
sql-server
  • 1 1 个回答
  • 382 Views

1 个回答

  • Voted
  1. Best Answer
    Paul White
    2025-03-06T16:42:55+08:002025-03-06T16:42:55+08:00

    不,没有本机 SQL Server 工具可以满足您的要求。

    如果表达式位于基表的计算列中,情况将会有所不同。

    例如:

    ALTER TABLE 
        dbo.Test_ScoreTable
        ADD 
            ScoreTimesTwo AS s * 2,
            ScoreTimesFive AS s * 5,
            ConditionalScore AS 
                CASE s
                    WHEN 100 THEN 'Good'
                    WHEN 10 THEN 'Bad'
                    ELSE 'Eh...'
                END;
    
    SELECT
        R.referenced_entity_name,
        C.[name],
        C.column_id,
        C.is_computed,
        CC.[definition]
    FROM sys.dm_sql_referenced_entities('dbo.Test_ScoreStoredProcedure', 'OBJECT') AS R
    JOIN sys.columns AS C
        ON C.[object_id] = R.referenced_id
    LEFT JOIN sys.computed_columns AS CC
        ON CC.[object_id] = C.[object_id]
        AND CC.column_id = C.column_id
        AND C.is_computed = 'true'
    WHERE
        R.referenced_minor_id = 0
        AND R.is_selected = 'true';
    
    引用实体名称 姓名 列 ID 已计算 定义
    测试成绩表 s 1 0 无效的
    测试成绩表 分数乘以二 2 1 ([s]*(2))
    测试成绩表 得分乘以五 3 1 ([s]*(5))
    测试成绩表 条件分数 4 1 (case [s] 当(100)时,则为“好” 当(10)时,则为“坏” 否则为“呃...” 结束)

    通过解析存储过程文本或使用ScriptDom 解析器的编程语言来手动完成这一操作并非不可能。

    • 11

相关问题

  • SQL Server - 使用聚集索引时如何存储数据页

  • 我需要为每种类型的查询使用单独的索引,还是一个多列索引可以工作?

  • 什么时候应该使用唯一约束而不是唯一索引?

  • 死锁的主要原因是什么,可以预防吗?

  • 如何确定是否需要或需要索引

Sidebar

Stats

  • 问题 205573
  • 回答 270741
  • 最佳答案 135370
  • 用户 68524
  • 热门
  • 回答
  • Marko Smith

    连接到 PostgreSQL 服务器:致命:主机没有 pg_hba.conf 条目

    • 12 个回答
  • Marko Smith

    如何让sqlplus的输出出现在一行中?

    • 3 个回答
  • Marko Smith

    选择具有最大日期或最晚日期的日期

    • 3 个回答
  • Marko Smith

    如何列出 PostgreSQL 中的所有模式?

    • 4 个回答
  • Marko Smith

    列出指定表的所有列

    • 5 个回答
  • Marko Smith

    如何在不修改我自己的 tnsnames.ora 的情况下使用 sqlplus 连接到位于另一台主机上的 Oracle 数据库

    • 4 个回答
  • Marko Smith

    你如何mysqldump特定的表?

    • 4 个回答
  • Marko Smith

    使用 psql 列出数据库权限

    • 10 个回答
  • Marko Smith

    如何从 PostgreSQL 中的选择查询中将值插入表中?

    • 4 个回答
  • Marko Smith

    如何使用 psql 列出所有数据库和表?

    • 7 个回答
  • Martin Hope
    Jin 连接到 PostgreSQL 服务器:致命:主机没有 pg_hba.conf 条目 2014-12-02 02:54:58 +0800 CST
  • Martin Hope
    Stéphane 如何列出 PostgreSQL 中的所有模式? 2013-04-16 11:19:16 +0800 CST
  • Martin Hope
    Mike Walsh 为什么事务日志不断增长或空间不足? 2012-12-05 18:11:22 +0800 CST
  • Martin Hope
    Stephane Rolland 列出指定表的所有列 2012-08-14 04:44:44 +0800 CST
  • Martin Hope
    haxney MySQL 能否合理地对数十亿行执行查询? 2012-07-03 11:36:13 +0800 CST
  • Martin Hope
    qazwsx 如何监控大型 .sql 文件的导入进度? 2012-05-03 08:54:41 +0800 CST
  • Martin Hope
    markdorison 你如何mysqldump特定的表? 2011-12-17 12:39:37 +0800 CST
  • Martin Hope
    Jonas 如何使用 psql 对 SQL 查询进行计时? 2011-06-04 02:22:54 +0800 CST
  • Martin Hope
    Jonas 如何从 PostgreSQL 中的选择查询中将值插入表中? 2011-05-28 00:33:05 +0800 CST
  • Martin Hope
    Jonas 如何使用 psql 列出所有数据库和表? 2011-02-18 00:45:49 +0800 CST

热门标签

sql-server mysql postgresql sql-server-2014 sql-server-2016 oracle sql-server-2008 database-design query-performance sql-server-2017

Explore

  • 主页
  • 问题
    • 最新
    • 热门
  • 标签
  • 帮助

Footer

AskOverflow.Dev

关于我们

  • 关于我们
  • 联系我们

Legal Stuff

  • Privacy Policy

Language

  • Pt
  • Server
  • Unix

© 2023 AskOverflow.DEV All Rights Reserve