gpt4 book ai didi

sql-server - 在 SQL Server View 中查找计算列

转载 作者:行者123 更新时间:2023-12-01 05:54:46 24 4
gpt4 key购买 nike

一位同事让我帮助他们识别具有一个或多个计算列的数据库中的 View 。该数据库有数百个 View ,因此他们试图找到一种自动化的方式来完成这项任务。我没有在数据库中看到我期望的结果。下面是一个例子:

--DROP TABLE dbo.Products

CREATE TABLE dbo.Products
(
ProductID int IDENTITY (1,1) NOT NULL
, QtyAvailable smallint
, UnitPrice money
);

--DROP VIEW dbo.uvw_Products
CREATE VIEW dbo.uvw_Products
AS
SELECT ProductID
, QtyAvailable
, UnitPrice
, (QtyAvailable * UnitPrice) AS InventoryValue
FROM dbo.Products;

-- Look at the view and find the computed column
SELECT OBJECT_SCHEMA_NAME(T.[object_id],DB_ID()) AS [Schema],
T.[name] AS [table_name], AC.[name] AS [column_name],
TY.[name] AS system_data_type, AC.[max_length],
AC.[precision], AC.[scale], AC.[is_nullable], AC.[is_ansi_padded], AC.[is_computed]
FROM sys.[views] AS T
INNER JOIN sys.[all_columns] AC ON T.[object_id] = AC.[object_id]
INNER JOIN sys.[types] TY ON AC.[system_type_id] = TY.[system_type_id] AND AC.[user_type_id] = TY.[user_type_id]
WHERE T.[is_ms_shipped] = 0
AND T.[name] = 'uvw_Products'
ORDER BY T.[name], AC.[column_id]


-- Pulls up no results - no entries in sys.computed_columns
SELECT TOP 10 *
FROM sys.computed_columns C
INNER JOIN sys.views V ON C.[object_id] = V.[object_id]
WHERE V.[name] = 'uvw_Products'

从这个简单的示例中可以看出,SQL Server 似乎没有将值存储在 is_computed 列中。

我错过了什么?我们如何在 View 中找到计算列?

最佳答案

我知道这并不理想,我不认为存在针对此问题的万无一失的解决方案,但是根据您的命名约定,您可以对列名的表 sys View 进行连接,以便查看哪些列存在和不存在在那里。

例如:

SELECT v.*
FROM
(
SELECT [Schema] = OBJECT_SCHEMA_NAME(t.[object_id], DB_ID())
, [table_name] = t.[name]
, [column_name] = vc.[name]
FROM sys.[views] t
JOIN sys.[all_columns] vc ON t.[object_id] = vc.[object_id]
) v
LEFT JOIN
(
SELECT [Schema] = OBJECT_SCHEMA_NAME(t.[object_id], DB_ID())
, [table_name] = t.[name]
, [column_name] = vc.[name]
FROM sys.[tables] t
JOIN sys.[all_columns] vc ON t.[object_id] = vc.[object_id]
) t
ON t.[column_name] = v.[column_name]
WHERE t.[table_name] IS NULL

返回:
Schema | table_name    | column_name
----------------------------------------
dbo | uvw_Products | InventoryValue

如果您的 View 在其名称中包含源表,如“uvw_Products”,您也可以在连接中使用它以避免其他表中的列妨碍。

再次它并不理想,而是缩小搜索范围的相对简单的解决方案

关于sql-server - 在 SQL Server View 中查找计算列,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50413508/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com