【发布时间】:2017-02-02 14:44:30
【问题描述】:
我有一个连接几个不同表的 SQL 视图,并且在某些情况下会更改返回的列 [编辑,而不是名称] 值。使用此数据集的应用程序需要偶尔更新视图基础表中的一个或多个列。我有一个简单的虚构示例来说明这一点……
表:领先
- 列:Id、Date、CustId、SalesId
表格:人
- 列:Id、First、Last、email
表格:地址
- 列:Id、Line1、Line2、城市、州、邮编
然后是这样的视图……
Create view uvw_LeadActivity
As
Select
L.Id as ‘LeadId’,
C.Id as ‘CustomerId’,
C.Last as ‘Customer.LastName’,
C.First as ’Customer.FirstName’,
C.email as ’Customer.Email’,
A.Id as ‘AddressId’,
A.Line1 as ‘Address1’,
A.Line2 as ‘Address2’,
A.City,
A.State,
A.Zip,
S.Id as ‘SalesId’,
S.Last as ‘Sales.LastName’,
S.First as Sales.FirstName’,
S.email as Sales.Email’,
L.Date
From
Lead L
Inner join Person C on C.Id = L.CustId
Inner join Person S on S.Id = L.SalesId
在应用程序中,我有视图列名称、值以及值是否已更改的指示符。我想发送视图列名称和已更改的值。因此,如果用户更新了 Customer.Email 列,我需要能够找出视图列来自的表和列来更新它。
我觉得我很接近,但我错过了一些东西,我希望很简单。我有这个 SQL 语句,用于尝试获取视图映射到的表和列...
SELECT
v.object_Id VIEW_ID,
v.name AS VIEW_NAME,
t.object_id AS TABLE_ID,
t.name AS TABLE_NAME,
c.name AS COLUMN_NAME,
c.column_id AS COLUMN_ID
FROM
sys.views v
JOIN sys.sql_dependencies d ON d.object_id = v.object_id
JOIN sys.objects t ON t.object_id = d.referenced_major_id
JOIN sys.columns c ON c.object_id = d.referenced_major_id AND c.column_id = d.referenced_minor_id
WHERE
v.name='[VIEWNAME]'
我的结果看起来像这样(精简):
VIEW_ID VIEW_NAME TABLE_ID TABLE_NAME COLUMN_NAME COLUMN_ID
1703311661 uvw_LeadActivity 199671759 Lead Id 1
1703311661 uvw_LeadActivity 199671760 Person Id 1
1703311661 uvw_LeadActivity 199671760 Person Last 2
1703311661 uvw_LeadActivity 199671760 Person First 3
我真的希望它看起来像这样(浓缩):
VIEW_ID VIEW_NAME VIEW_COLUMN TABLE_ID TABLE_NAME COLUMN_NAME COLUMN_ID
1703311661 uvw_LeadActivity LeadId 199671759 Lead Id 1
1703311661 uvw_LeadActivity Customer.Id 199671760 Person Id 1
1703311661 uvw_LeadActivity Customer.LastName 199671760 Person Last 2
1703311661 uvw_LeadActivity Customer.FirstName 199671760 Person First 3
事实是,我并不真正需要整个结果(查询),只需要能够(使用此示例)获取 Customer.Email 的表和列。有了它,我可以编写需要的 SQL 来更新。我无法对这个逻辑进行硬编码,因为 SQL DBA 会随着时间的推移根据业务需要更新视图。
我希望这个问题很清楚。提前致谢!
更新:我希望它能够将单个列和更新值或多个列/值对接收到存储过程中,并从该输入更新基于表。这是总体大纲...
create proc usp_UpdateData
@EntityId int,
@columnName varchar(max),
@newVaule varchar(max)
as
Declare @baseTableName varchar(max)
Declare @baseColumnName varchar(max)
Declare @sqlCmd varchar(max)
DECLARE @ParmDefinition varchar(max);
Select @baseTableName=[Table], @baseColumnName=[Column] from [MAGICQUERY]
SET @ParmDefinition = N'@Table varchar(max), @Column varchar(max), @Value varchar(max) @Id int';
SET @sqlCmd = N'Update @Table Set @Column = @Value Where Id = @Id';
EXECUTE sp_executesql @sqlCmd, @ParmDefinition, @Table = @baseTableName, @Column=@baseColumnName, @Value=@newVaule, @Id=@EntityId;
所以 [MAGICQUERY] 是我在这里尝试解决的问题。
【问题讨论】:
-
最终目标是更新视图还是我读错了? 因此,如果用户更新了 Customer.Email 字段,我需要能够找出视图列来自的表和列来更新它。
-
看看INFORMATION_SCHEMA的意见
-
我不认为,现有的元数据允许您动态查找视图在哪个别名下吐出列的值...如果我理解正确的话,我想到的唯一方法是一个自维护的映射表...
-
@SCEV,请参阅示例的更新答案。
标签: sql-server tsql