当前位置: 首页 > 知识库问答 >
问题:

SQL视图中的动态模式名称

商嘉木
2023-03-14

我有两个数据集:

    < li >一个是关于狗的数据[我的数据] < li >第二个是匹配关键字的查找表[我无法控制该数据]

匹配键会定期更新,我想创建 Dog 数据集的视图(或实现相同目的的视图),该视图始终联接最新的匹配键。此外,我需要能够内联引用它 - 就好像它是一个表格一样。

查找表中的匹配更新通过其模式名称来区分,因此要获取最新的,我只需识别最新的模式名称并将其从查询中交换出来。

假设视图和表值函数都禁止动态SQL,并且存储过程不能像表那样被引用,那么我如何仅用SQL来实现这一点呢?

共有1个答案

单于季
2023-03-14

查找表中的匹配更新根据它们的模式名称进行区分,所以为了获得最新的模式名称,我只需要确定最新的架构名称并将其替换出查询。

您可以使用视图来解决这个问题,但每当向数据库中输入新数据时,都需要某种方法来更改它。

我假设每当创建新模式时,也会在该模式中创建一个新表,但表名和列名总是相同的。请注意,这个假设对我即将提出的解决方案至关重要,该解决方案是使用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