我有两个数据集:
匹配键会定期更新,我想创建 Dog 数据集的视图(或实现相同目的的视图),该视图始终联接最新的匹配键。此外,我需要能够内联引用它 - 就好像它是一个表格一样。
查找表中的匹配更新通过其模式名称来区分,因此要获取最新的,我只需识别最新的模式名称并将其从查询中交换出来。
假设视图和表值函数都禁止动态SQL,并且存储过程不能像表那样被引用,那么我如何仅用SQL来实现这一点呢?
查找表中的匹配更新根据它们的模式名称进行区分,所以为了获得最新的模式名称,我只需要确定最新的架构名称并将其替换出查询。
您可以使用视图来解决这个问题,但每当向数据库中输入新数据时,都需要某种方法来更改它。
我假设每当创建新模式时,也会在该模式中创建一个新表,但表名和列名总是相同的。请注意,这个假设对我即将提出的解决方案至关重要,该解决方案是使用DDL触发器在数据库级别监听create_table
事件来更改视图,以便它引用新创建的表的模式。
我做的另一个假设是,您要么已经有了初始视图,要么正在使用SQL Server 2016或更高版本(允许创建或更改语法)。
首先,让我们创建初始视图:
CREATE VIEW dbo.TheView
AS
SELECT NULL As Test
GO
然后,我添加了DML触发器,它根据新创建表的模式创建并执行动态更改视图
语句:
CREATE TRIGGER AlterViewWhenSchemaChanges
ON DATABASE
FOR CREATE_TABLE
AS
DECLARE @Sql nvarchar(max),
@NewTableName sysname,
@NewSchemaName sysname;
SELECT @NewSchemaName = EVENTDATA().value('(/EVENT_INSTANCE/SchemaName)[1]', 'NVARCHAR(255)'),
@NewTableName = EVENTDATA().value('(/EVENT_INSTANCE/ObjectName)[1]', 'NVARCHAR(255)');
-- We only want to alter the view when this specific table is created!
IF @NewTableName = 'TableName'
BEGIN
SELECT @Sql =
'ALTER VIEW dbo.TheView
AS
SELECT Col as test
FROM '+ @NewSchemaName +'.'+ @NewTableName
EXEC(@Sql)
END
GO
这样,每当创建一个具有特定名称的新表(在我的示例中为< code>TableName)时,视图就会被修改为引用最后创建的< code>TableName(显然是在最新的模式中创建的)。
测试脚本:
SELECT * FROM dbo.TheView;
GO
结果:
Test
NULL
使用表< code>TableName创建新的架构
CREATE SCHEMA SchemaName
CREATE TABLE SchemaName.TableName (Col int);
GO
-- insert some data
INSERT INTO SchemaName.TableName(Col) VALUES (123);
-- get the data from the altered view
SELECT * FROM dbo.TheView
结果:
test
123
你可以在Rextester上看到一个现场演示。
问题内容: 给定两个示例表: 门票表 属性表 我如何获得这样的视图: 重要的是要注意,属性表并不总是相同的。一些“票证”可能具有其他人没有的属性。 这有可能吗? 问题答案: 您可以使用PIVOT执行此操作。在执行PIVOT时,可以使用以下两种方法之一进行操作:使用“静态数据透视表”(将对行进行编码)或“动态数据透视表”将在运行时创建列列表: 静态数据透视表(请参见SQL Fiddle中的Demo)
我正在设计一个具有滚动视图的页面,其上方是表格视图(禁用滚动)。为此,我在这个问题中提到了答案 - 使UITableView不可滚动并调整高度以容纳所有单元格,但没有成功。 视图层次结构以及提供的约束- -主视图 -滚动视图< br >固定在主视图的所有边上(0,0,0,0),限制边距 -内容视图 固定到滚动视图(0,0,0,0),与主视图宽度相等,与主视图高度相等(优先级-250) -内容视图中
问题内容: 我有一个AngularJS表单,我在其中使用ng-repeat根据另一个选择动态地构建表单的字段。我正在尝试动态生成模型名称,并且遇到了问题。 我需要的是评估为ng-model =“ formData.parameters.fooId”或ng-model =“ formData.parameters.barId” 上面的结果导致错误:错误:[$ parse:syntax]语法错误:标记
问题内容: 我正在尝试执行这样的mysql查询 它显示这样的错误 我该如何实现? 问题答案: 在查询中动态表名的使用最好与 Prepared Staments一起使用 ,在mysql中也可以使用串联功能 您也可以针对删除查询执行此操作
问题内容: 大家好,我有一个要使用的可怕数据库,而linqtosql是我从中检索数据的选项。任何试图通过基于用户选择抛出不同的表名来重用函数的人,据我所知,没有办法修改DataContext查询中的TEntity或。 这是我当前的代码。 我想用Enumerable记录填充ViewData。 问题答案: 您可以在DataContext实例上调用ExecuteQuery方法。您将要调用采用Type实例
实际上,我知道如何用SQL创建视图。但是我被这个案子缠住了。 我的一个数据库每月创建一次表。例如,表名称为 、、,因此下个月新表将为 。所有表都具有相同的列。但是数据的差异,我想为所有这些动态表生成一个视图。但我不知道如何为未来的表格制作逻辑。让我知道在这种情况下 查看是可能的,并让我知道您的解决方案。 请帮帮忙! 我会再解释清楚, 示例: < li >我的数据库名是TAS < li >在< co