标签: sql-server-2017

SQL Server 2017 企业版与标准版 - 在线索引和在线架构更改

我通读了 Microsoft 的“ SQL Server 2017 的版本和支持的功能”文档,以比较企业版和标准版之间的功能差异。

标准版中没有引起我注意的两件事是:

  1. 在线索引

  2. 在线模式更改

这是否意味着您不能在不先使数据库脱机的情况下创建和修改索引或表(以及其他对象?),或者 Microsoft 是否意味着只有特定的操作您不能执行,如果是这样,我在哪里可以了解更多信息哪些操作需要使数据库脱机?

sql-server standard-edition enterprise-edition online-operations sql-server-2017

7
推荐指数
2
解决办法
7360
查看次数

为什么添加计算列会阻止谓词下推?

我有一个奇怪的情况,我不太明白。

我有一张这样的桌子:

CREATE TABLE dbo.cc_demo
     (
         id INT IDENTITY PRIMARY KEY,
         up_action INT,
         down_action INT,
         last_action_date DATETIME
     );

INSERT dbo.cc_demo ( up_action, down_action, last_action_date )
SELECT TOP 5000000
       nums.num % 500000, nums.num % 500000, DATEADD(MINUTE, nums.num, GETDATE())
FROM
       (   SELECT     ROW_NUMBER() OVER ( ORDER BY ( SELECT NULL )) AS num
           FROM       master..spt_values AS sv
           CROSS JOIN master..spt_values AS sv2 ) AS nums;
Run Code Online (Sandbox Code Playgroud)

如果我运行这个查询,该计划只是一个常规的聚集索引扫描。

SELECT *
FROM   dbo.cc_demo AS cd
WHERE  cd.last_action_date >= '20270601'
AND    cd.last_action_date < '20270901';
Run Code Online (Sandbox Code Playgroud)

是的

哦耶

但是如果我添加一个计算列并索引它,我的计划会发生最坏的变化。

ALTER …
Run Code Online (Sandbox Code Playgroud)

index sql-server computed-column sql-server-2017

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

基于多个可为空的列派生计算列

我有点像 SQL 新手。

我一直在尝试创建一个TAG从其他 5 个列调用的自动生成的列,其中一些可以保留 NULL 标记。

用于创建自动生成列的语法是:

[Tag]  AS ([Tag Type]+[Parent Tag Type]+[Tag Area No]+[Tag seq No]+[Tag Suffix])
Run Code Online (Sandbox Code Playgroud)

如果五列都没有保留 NULL,则自动生成 OK ,但是如果我尝试使用包含 NULL 的任何一列创建一行,自动生成不起作用,并将TAG列留空,即使它创建了行确定所有单独的列数据。

有没有办法让自动生成与 NULL 一起工作?

null sql-server computed-column sql-server-2017

7
推荐指数
2
解决办法
529
查看次数

更新时态表时出错

我已经在“订单”表上实现了系统版本化临时表。应用程序使用不同的访问模式来修改此表中的数据。有来自应用程序的直接语句,或者应用程序在显式事务中运行长批处理,其中对多个表进行了多次更改。“订单”表上的更新不是那些长批次中的第一条语句!因此,有时我们会面临以下错误。

系统版本化表“Orders”上的数据修改失败,因为事务时间早于受影响记录的期间开始时间。

显然,这是系统版本化临时表的标准行为。https://docs.microsoft.com/en-us/sql/relational-databases/tables/temporal-tables?view=sql-server-2017#how-does-temporal-work

这是总是需要在异常例程中处理的东西吗?还是微软正在考虑改变这种行为?

-- 模拟错误信息的脚本:

CREATE TABLE dbo.Orders 
    (    
      [OrderId] INT NOT NULL PRIMARY KEY CLUSTERED  
      , [OrderValue] DECIMAL(19,4)
      , [ValidFrom] DATETIME2 (2) GENERATED ALWAYS AS ROW START  
      , [ValidTo] DATETIME2 (2) GENERATED ALWAYS AS ROW END  
      , PERIOD FOR SYSTEM_TIME (ValidFrom, ValidTo)  
     )    
     WITH (SYSTEM_VERSIONING = ON (HISTORY_TABLE = dbo.OrdersHistory)); 
     GO

     INSERT dbo.Orders ([OrderId], [OrderValue])
     VALUES (1, 9.99), (2, 9.99);
     GO

     SELECT * FROM dbo.Orders;
     GO

       --Run first query
   BEGIN TRAN
      WAITFOR DELAY '00:00:15';
      UPDATE dbo.Orders 
      SET …
Run Code Online (Sandbox Code Playgroud)

sql-server temporal-tables sql-server-2016 sql-server-2017

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

轻量级池会禁用内置 CLR 工具吗?

以纤程模式(轻量级池)运行 SQL Server会禁用 SQL CLR:

轻量级池不支持公共语言运行时 (CLR) 执行。禁用以下两个选项之一:“启用 clr”或“轻量级池化”。依赖 CLR 且在光纤模式下无法正常工作的功能包括层次结构数据类型、复制和基于策略的管理。

在另一方面,禁用SQL CLR单独(无实现了轻型池)并没有禁用内置的CLR类型,如geometry,和geography(虽然hierarchyid上面提到的),如图哪有“HIERARCHYID”类型的工作时,“CLR”被禁用?

现在一些新的语言特性依赖于CLR,例如FORMAT功能

FORMAT 依赖于 .NET Framework 公共语言运行时 (CLR) 的存在。

在光纤模式下运行 SQL Server 是否禁用该FORMAT功能和/或使用 CLR 类型?

sql-server t-sql sql-clr format sql-server-2017

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

我可以只计算连续记录的 ROW_NUMBER() 吗?

我需要计算连续值的序列号。这听起来像是一份工作ROW_NUMBER()

DECLARE @Data TABLE
    (
    Sequence    TINYINT NOT NULL PRIMARY KEY,
    Subset  CHAR(1) NOT NULL
    )
INSERT INTO @Data (Sequence, Subset) VALUES
    (1, 'A'),
    (2, 'A'),
    (3, 'A'),
    (4, 'B'),  -- New subset
    (5, 'B'),
    (6, 'A')   -- New subset

SELECT
    Sequence, Subset,
    ROW_NUMBER() OVER (PARTITION BY Subset ORDER BY Sequence) AS SeqWithinGroup
FROM
    @Data
Run Code Online (Sandbox Code Playgroud)

我希望该PARTITION子句在 中的每次更改时重置计数Subset,但 SQL Server 会收集给定Subset值的所有值并对它们进行编号。这是我所期望的,以及我得到的:

Sequence Subset Expected Actual
-------- ------ -------- -----
1        A      1        1 …
Run Code Online (Sandbox Code Playgroud)

sql-server window-functions gaps-and-islands sql-server-2017

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

删除 SQL Server 14.0 上的数百万条记录

我有两个表,每个表包含 2 亿条记录。我必须根据列中的整数值从它们中删除大约 7000 万条记录。

我使用以下脚本以 4000 块为单位删除它们:

DECLARE @BATCHSIZE INT, @ITERATION INT, @TOTALROWS INT, @MSG VARCHAR(500)
DECLARE @STARTTIME DATETIME, @ENDTIME DATETIME

SET NOCOUNT ON;
SET DEADLOCK_PRIORITY LOW;
SET @BATCHSIZE = 4000
SET @ITERATION = 0 
SET @TOTALROWS = 0 

WHILE @BATCHSIZE>0
BEGIN   
    SET @STARTTIME = GETDATE();

    BEGIN TRANSACTION
    DELETE TOP(@BATCHSIZE)
    FROM [mydb].[dbo].tableA 
    WHERE [mydb].[dbo].tableA.Code not IN (
            SELECT Code
            FROM [mydb].[dbo].TableB)

    SET @BATCHSIZE=@@ROWCOUNT
    SET @ITERATION=@ITERATION+1
    SET @TOTALROWS=@TOTALROWS+@BATCHSIZE
    COMMIT TRANSACTION;

    SET @ENDTIME = GETDATE();

    SET @MSG = 'Iteration: ' + …
Run Code Online (Sandbox Code Playgroud)

sql-server delete sql-server-2017

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

未部署 SSIS 包

我有一个 SSIS 包的问题,​​当通过 VS2017 部署到集成服务目录时,实际上并未部署。这是一个单独的包部署,而不是一个项目部署。没有错误消息,部署似乎顺利进行。检查初始包和项目表表明虽然部署已经发生(项目时间戳被更新),但最新版本的包代码尚未真正部署,因为包表上的版本号与 Visual 中的最新版本不匹配工作室。

事实上,这个问题与另一位成员在之前的帖子中描述的完全一样,只是没有对该帖子的决议进行更新。我希望其他人可能遇到过这种情况。

为什么我的 SSIS 包没有更新?

一些可能有帮助的附加信息:

右键单击,项目部署 - 这有效(我们已经在另一个项目中尝试过这个,尽管对于我们真正感兴趣的项目,我们不能这样做,因为并非所有的包都准备好在项目级别进行部署)。

右键单击,包部署 - 这不起作用(部署报告为成功,但显然包尚未部署)。

从命令行为相关包调用 ISDeploymentWizard 也不起作用。同样,没有报告错误,但没有部署任何内容。

通过 Visual Studio 使用向导时,您可以在所有阶段保存部署后报告“成功”的 XML。

谢谢你。

ssis ssdt sql-server-2017 visual-studio-2017

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

AlwaysOn 高可用性不起作用,无法激活它

我正在尝试在我的 SQL 服务器上激活高可用性并收到以下消息:

在此处输入图片说明

SQL 服务器版本:Microsoft SQL Server 2017 (RTM) - 14.0.1000.169 (X64) 2017 年 8 月 22 日 17:04:49 版权所有 (C) 2017 Microsoft Corporation Express Edition(64 位),Windows Server 2012 R2 Datacenter 6.3(Build 9600) :)(管理程序)

操作系统:windows server 2012。

感谢任何帮助。

sql-server express-edition availability-groups sql-server-2017

7
推荐指数
2
解决办法
1300
查看次数

SQL SERVER 哪个查询更快

哪个查询更快:

查询 A

SELECT I.ItemName
FROM Location L
INNER JOIN Items I ON I.LocationID = L.LocationID
WHERE L.LocationID = 1
Run Code Online (Sandbox Code Playgroud)

执行计划 在此处输入图片说明

查询 B

SELECT ItemName
FROM Items 
WHERE ItemID IN (
SELECT ItemID
FROM  Items
WHERE LocationID = 1)
Run Code Online (Sandbox Code Playgroud)

执行计划 在此处输入图片说明

sql-server sql-server-2017

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