标签: sql-server

为什么向视图添加列会损坏表值函数?

我有一个 TVPmyTVP实现为select val.* from vw_MyView val. 前几天,我修改了vw_MyView,将: 替换
select Foo,Bar from DB
select Foo, Bash, Bar from DB

这有一个奇怪的副作用:调用select Bar from myTVP()返回一个名为Bar填充了内容的列Bash(尽管事实上BarBash甚至没有相同的类型)。

展示问题的匿名计划:https://www.brentozar.com/pastetheplan/?id=ryJLJmqdl

请注意,Object2Object1是相同的,但两个计划之间最左侧嵌套循环的输出列表完全不同。

笔记:

  • 使用中没有计划提示。未设置跟踪标志。
  • CheckDB 没有发现错误。
  • 使用选项(重新编译)并没有解决问题。
  • 在 TVP 上运行右键单击 alter 且不进行任何更改修复了该问题。
  • 在名称更改的 TVP 上运行右键单击 alter 修复了该问题,但新的 TVP 除名称外与之前的相同。
  • 使用SQL 2014标准版。

问题:

  1. 向视图添加新列以更改对该视图的其他引用所使用的视图列是否正常?
  2. 在什么情况下向视图添加列会导致这种行为?

sql-server view sql-server-2014 set-returning-functions

1
推荐指数
1
解决办法
387
查看次数

查询以从仅包含开始日期的列表计算开始和结束日期

我有以下形式的数据需要合并,以便我从两行输入数据创建一行,其中第二列是下一行减去一天的值。

我一直在努力想出一种方法来做到这一点,但没有走得太远。我希望这张图能解释这个问题:

表结构

CREATE TABLE Process(
    ProcessOrder int NOT NULL IDENTITY (1, 1),
    ProcessDate date NOT NULL
);
Run Code Online (Sandbox Code Playgroud)

询问

SELECT ProcessOrder, ProcessDate From Process ORDER BY ProcessOrder;
Run Code Online (Sandbox Code Playgroud)

数据

ProcessOrder  ProcessDate
------------  -----------
208           2016-01-04
209           2016-01-11
210           2016-01-18
211           2016-01-25
212           2016-02-01
213           2016-02-08
Run Code Online (Sandbox Code Playgroud)

我需要将上述数据变成以下形状(注意,从后续记录来看,ProcessEnd 比 ProcessBegin 少一天):

ProcessOrder  ProcessBegin  ProcessEnd
------------  ------------  ----------
208           2016-01-04    2016-01-10
209           2016-01-11    2016-01-17
210           2016-01-18    2016-01-24
211           2016-01-25    2016-01-31
212           2016-02-01    2016-02-07
213           2016-02-08    *NULL*
Run Code Online (Sandbox Code Playgroud)

编辑

我保证 ProcessOrder 列中的值是连续的,没有缺失值。

sql-server t-sql sql-server-2008-r2

1
推荐指数
1
解决办法
2万
查看次数

SQL Server 版本:在标准版 2017 上备份还原企业版 2014

我知道,这类问题已经被回答过几次了,但我没有找到一些当前的答案,并且想知道 SQL Server Standard Edition 2016 SP1 是否在这方面做了一些改变,因为它支持企业版之前支持的所有“可编程性功能”仅有的。

我的具体场景如下:我有一个中央备份服务器,它将运行 SQL Server 2017 标准版,并定期恢复从其他 SQL Server 实例获取的新备份。大多数实例也将使用 SQL Server 2017 Standard...但是有一个数据仓库运行 SQL Server 2014 Enterprise Edition。

  • 是否可以在 SQL Server 2017标准版实例上还原从 SQL Server 2014企业版实例获取的备份,或者这是否会导致有关企业版功能的错误?
  • 有什么方法可以免费试用吗?SQL Server 评估版相当于企业版,不是吗?微软现在是否引入了一种将开发人员和评估许可证降级到 SQL Server 标准版功能的方法?

预先非常感谢您的协助

sql-server restore standard-edition enterprise-edition

1
推荐指数
1
解决办法
4575
查看次数

分离 SQL Server 数据库而不删除它?

有没有办法在不删除数据库的情况下分离数据库?

sql-server

1
推荐指数
1
解决办法
4441
查看次数

每 150 行增加一个整数

我正在尝试编写一个 SELECT 查询来计算BatchNumber从 1001 开始每 150 行增加 1 的列。

预期BatchNumber应该是1001前 150 行,然后1002是第 151-300 行,依此类推...

我尝试过在动态上使用除法ROW_NUMBER(),但无法得到它。

SELECT ID
    ,ROW_NUMBER() OVER (ORDER BY (SELECT ID)) AS RowNumber
    ,CASE
        WHEN CONVERT(INT, (ROW_NUMBER() OVER (ORDER BY (SELECT ID)) % 150))=0
        THEN 0 ELSE 1001 END
    + CONVERT(INT,(ROW_NUMBER() OVER (ORDER BY (SELECT ID)) / 150))
    AS BatchNumber  
FROM Table1 WITH (NOLOCK);
Run Code Online (Sandbox Code Playgroud)

sql-server-2008 sql-server sql-server-2008-r2

1
推荐指数
1
解决办法
860
查看次数

利用触发器动态改变分区函数

我想利用基于 a 的分区[TenantId](稍后与日期范围结合使用)。我不需要在 中手动插入最新值PARTITION FUNCTION,而是考虑创建一个TRIGGER AFTER INSERT来提取[TenantId]值并将ALTER PARTITION FUNCTION其添加到 中SPLIT RANGE。然而,我遇到了一个意想不到的错误:

无法对/使用表“租户”执行 ALTER PARTITION FUNCTION,因为该表是目标表或当前正在执行的触发器的级联操作的一部分。

首先,我创建PARTITION FUNCTION [PF_Tenant_Isolation]PARTITION SCHEME [PS_Tenant_Isolation]以便在 上进行分区[TenantId]

CREATE PARTITION FUNCTION [PF_Tenant_Isolation] ([int])
    AS RANGE LEFT FOR VALUES (1);
GO

CREATE PARTITION SCHEME [PS_Tenant_Isolation]
    AS PARTITION [PF_Tenant_Isolation]
    ALL TO ([Auth]);
GO
Run Code Online (Sandbox Code Playgroud)

接下来,我将[Tenant]根据新创建的分区方案创建表。

IF OBJECT_ID('[Auth].[Tenant]', 'U') IS NULL
BEGIN
    CREATE TABLE [Auth].[Tenant] (
        [TenantId] [int] IDENTITY(1,1)
        ,[TenantActive] [bit] …
Run Code Online (Sandbox Code Playgroud)

database-design sql-server partitioning sql-server-2016

1
推荐指数
1
解决办法
2814
查看次数

带有可选参数的存储过程限制返回的行(如果指定)

如何拥有一个允许消费者有选择地指定返回行数的存储过程?

如果未指定行数,则返回所有行。

sql-server stored-procedures azure-sql-database top

1
推荐指数
1
解决办法
893
查看次数

`select OBJECT_ID(N'X')` 需要“永远”

我遇到过 SQL Server 的奇怪状态。在一个特定的数据库中,此 SQL Serverselect OBJECT_ID(N'X')需要“永远”。如何诊断发生了什么?

编辑:问题消失了。不过,我还是很好奇到底发生了什么。

sql-server

1
推荐指数
1
解决办法
223
查看次数

SQL Server 2016 的查询通知等效项

我正在寻找查询通知,以便在多个客户端上收到特定表更改的通知。看来这个功能在SQL Server 2008 R2中已经被删除了。文档对此不是很清楚。

到底什么时候删除了这个(具体是哪个版本)?

有没有其他方法可以在不使用额外组件的情况下进行管理?

sql-server event-notification

1
推荐指数
1
解决办法
2403
查看次数

非聚集索引叶级

创建非聚集索引时,叶级将包含对原始表中行的引用:

  • 如果表有聚集索引,则叶级将包含聚集索引键;
  • 如果表没有聚集索引(堆),则叶级将包含指向表中行的物理地址的指针;

我的问题是为什么非聚集索引没有设计为在这两种情况下包含物理地址(除了聚集索引键之外)。当定义聚集索引时,它可以保存 B-Tree 的读取以用于键查找。

sql-server nonclustered-index

1
推荐指数
1
解决办法
969
查看次数