标签: sql-server-2016

SQL Server Always Encrypted 可以用于临时表吗?

我正在尝试确定是否可以对临时表(Windows 2016 上的 SQL Server 2016 SP1 Enterprise)中的列使用 Always Encrypted。我试过如下:

CREATE TABLE #listofdates (compare_dt datetime2(7) encrypted with (
    COLUMN_ENCRYPTION_KEY = [ColEnc1]
    , ENCRYPTION_TYPE = Deterministic
    , ALGORITHM = 'AEAD_AES_256_CBC_HMAC_SHA_256'
    ) NOT NULL
)
Run Code Online (Sandbox Code Playgroud)

但是,我收到错误:

消息 33293,级别 16,状态 8,第 3 行
找不到列加密密钥“ColEnc1”,因为它不存在或您没有权限。

我认为此错误具有误导性,因为如果我只是将表名替换为#listofdates另一个没有前导 # 的名称(因此从临时表切换到普通表),则该语句有效。

MS 站点上列出对 Always Encrypted 的限制/限制的部分没有提到临时表。

sql-server temporary-tables sql-server-2016 always-encrypted

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

运行 sp_Blitz 所需的最低权限

我需要运行sp_BlitzGlenn Berry 的 Dr DMV 并为 SQL 2016 设置一堆 DMV 查询sp_Blitz。BrentOzar.com 上的文档指出“系统管理员权限。sp_Blitz® 检查大量系统级诊断数据。”

sysadmin 真的是所需的最低权限级别还是有人能够以更严格的权限级别运行它?

不确定我是否会在客户端的生产服务器上请求 sysadmin 权限。

security sql-server sql-server-2016 sp-blitz

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

连接超时已过期但没有明显的网络问题

我们有一个特定的 SQL Server,它在接受连接时会间歇性地超时。该问题全天都是一致的,但发生率非常低。如何继续排除故障?

连接超时已过期。尝试使用登录前握手确认时超时时间已过。这可能是因为登录前握手失败或服务器无法及时响应。尝试连接到此服务器所花费的持续时间是 - [Pre-Login] 初始化 = 0; 握手=15002;(Microsoft SQL Server,错误:-2)

服务器配置:

  • SQL Server 2016 SP1 CU5 Enterprise(SP1 之前也出现过问题)
  • 服务器和客户端上的 Windows Server 2012 R2
  • HP ProLiant DL360 Gen9 上的 VMware ESXi,6.5.0
  • VM 有 8 个 vCPU,64 GiB 内存(完全保留)

测试脚本(每秒执行一次):

$failed = $false;
$loginDuration = (Measure-Command {
    $ncon = New-Object System.Data.SqlClient.SqlConnection `
        @( 'Data Source=1.2.3.4,16143;Database=Test;User=Test;Password=****;Pooling=false;' );
    try 
    {
        $ncon.Open();

        $cmd = New-Object System.Data.SqlClient.SqlCommand `
            @( 'SELECT @@VERSION', $ncon );
        $cmd.ExecuteNonQuery();

        $ncon.Dispose();
    }
    catch
    {
        $failed = $true;
    }
}).TotalMilliseconds;
Write-Metric …
Run Code Online (Sandbox Code Playgroud)

sql-server vmware connectivity sql-server-2016

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

如何在 SQL Server 中获取 CPU 速度?

当我从Glenn Berry运行以下查询时

-- Hardware information from SQL Server 2016  (Query 18) (Hardware Info)
SELECT cpu_count AS [Logical CPU Count], scheduler_count, hyperthread_ratio AS [Hyperthread Ratio],
cpu_count/hyperthread_ratio AS [Physical CPU Count], 
physical_memory_kb/1024 AS [Physical Memory (MB)], committed_kb/1024 AS [Committed Memory (MB)],
committed_target_kb/1024 AS [Committed Target Memory (MB)],
max_workers_count AS [Max Workers Count], affinity_type_desc AS [Affinity Type], 
sqlserver_start_time AS [SQL Server Start Time], virtual_machine_type_desc AS [Virtual Machine Type], 
softnuma_configuration_desc AS [Soft NUMA Configuration],
sql_memory_model_desc -- New in SQL Server 2016 SP1 …
Run Code Online (Sandbox Code Playgroud)

sql-server powershell sql-server-2016 cpu

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

数据库损坏:QueryStore 内部表

今天早上,收到了以下电子邮件警报:

日期/时间:2/28/2018 9:26:42 AM

描述:尝试在数据库 9 中获取逻辑页 (1:3948712) 失败。它属于分配单元 72057594045857792 不属于 72059184917512192。

评论:(无)

作业运行:SQL Sentry 2.0 警报陷阱

查看辅助副本的事件日志,同一消息出现了 3 次:

源 spid138

消息 尝试获取数据库 9 中的逻辑页 (1:3948712) 失败。它属于分配单元 72057594045857792 不属于 72059184917512192。

在辅助副本(2 节点同步可用性组)上运行以下内容:

DBCC TRACEON(3604)
dbcc page (9, 1,3948712,3)
go
DBCC TRACEOff(3604)
Run Code Online (Sandbox Code Playgroud)

任一副本的结果片段:

Page @0x00000070DAB8C000

m_pageId = (1:3948712)              m_headerVersion = 1               
m_type = 3 m_typeFlagBits = 0x0                m_level = 0            
m_flagBits = 0x8200 m_objId (AllocUnitId.idObj) = 129   m_indexId
(AllocUnitId.idInd) = 256  Metadata: AllocUnitId = 72057594046382080  
Metadata: PartitionId = 72057594040811520                             
Metadata: …
Run Code Online (Sandbox Code Playgroud)

sql-server corruption sql-server-2016 query-store

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

将变量作为参数传递给 json_query 函数

我收到错误:

“JSON_VALUE 或 JSON_QUERY”的参数 2 必须是字符串文字

...同时尝试将变量作为参数传递给JSON_QUERY函数。请帮我解决它。

DECLARE @cnt INT = 1;
DECLARE @cnt_total INT = 1;
DECLARE @json NVARCHAR(MAX);
DECLARE @json1 NVARCHAR(MAX);
declare @str  VARCHAR(200);

WHILE @cnt <= 10
BEGIN
    set @str = '$.Seasons[0].Products['+convert(varchar,@cnt)+'].ProductChannels';
    set @str = char(39) +@str+ char(39);
    PRINT @STR
    select @json = json_query(jfile,@STR) from Import.tstjson;
--MORE CODE     
   SET @cnt = @cnt + 1;
END
Run Code Online (Sandbox Code Playgroud)

样本数据:

DECLARE @cnt INT = 1;
DECLARE @cnt_total INT = 1;
DECLARE @json NVARCHAR(MAX);
DECLARE @json1 NVARCHAR(MAX);
declare @str  VARCHAR(200); …
Run Code Online (Sandbox Code Playgroud)

sql-server t-sql json sql-server-2016

6
推荐指数
2
解决办法
7667
查看次数

Sqlcmd:无效参数 - 尝试将变量传递给 sqlcmd 时

我正在尝试在 Server 2012R2 上使用 DOS 命令提示符来运行包含以下内容的批处理。我想运行一个 SQL 命令 (sqlcmd) 并将结果返回到命令窗口。

这就是我目前正在尝试的,但 sqlcmd 不断抛出Sqlcmd: 'test': Invalid argument. Enter '-?' for help.20:56:08.

FOR /F "tokens=* USEBACKQ" %%F IN (`sqlcmd -S localhost -E -i "backup.sql" -v dbname="test"`) DO (
    Echo %%F
)
Run Code Online (Sandbox Code Playgroud)

但是,如果我在没有参数/变量的情况下尝试它,它会完美运行!

FOR /F "tokens=* USEBACKQ" %%F IN (`sqlcmd -S localhost -E -i "backup.sql"`) DO (
    Echo %%F
)
Run Code Online (Sandbox Code Playgroud)

有没有人知道使用 sqlcmd、DOS CMD 以及 FOR /F 循环(例如在我的第一个示例中)将变量传递给我的 sql 查询的方法?

scripting sql-server-2016

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

异常的列比较和查询性能

我们有一些顾问致力于扩展内部数据仓库。我正在做代码审查并在所有加载过程中遇到这种模式:

    MERGE [EDHub].[Customer].[Class] AS TARGET
    USING (
        SELECT <columns>
        FROM [dbo].[vw_CustomerClass]
            WHERE JHAPostingDate = @PostingDate   
        ) AS SOURCE
        ON  TARGET.BankId = SOURCE.BankId       -- This join is on the business keys
            AND TARGET.Code = SOURCE.Code
    WHEN NOT MATCHED BY TARGET  
        THEN
            <INSERT Statement>
    WHEN MATCHED
        AND TARGET.IsLatest = 1
        AND EXISTS (
            SELECT SOURCE.[HASH]   
            EXCEPT          
            SELECT TARGET.[Hash]
            )
        THEN 
            <UPDATE Statement>
Run Code Online (Sandbox Code Playgroud)

要点是,如果我们有一个新的业务键,则插入,但如果业务键存在并且属性的散列与我们的当前行不匹配,则更新旧行并插入一个新行(稍后在代码中)。一切正常,但是当我看到这段代码时我暂停了

AND EXISTS (
            SELECT SOURCE.[HASH]   
            EXCEPT          
            SELECT TARGET.[Hash]
            )
Run Code Online (Sandbox Code Playgroud)

与 SOURCE.[HASH] <> TARGET.[Hash] 相比,它似乎过于复杂。EXCEPT 将进行准确的 NULL 比较,但在我们的情况下,哈希值永远不会为 NULL(或者我们有更大的问题)。我希望我们的代码易于阅读,这样当有人必须维护它时,它不会混淆。我向我们的顾问询问了它,他们推测它可能会因为集合操作而更快,但我决定编写一个简单的测试(下面的测试代码)。

我注意到的第一件事是 …

performance sql-server sql-server-2016 except query-performance

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

如何从表格中检索大文本?

为了我自己的记录,我在其中一台服务器上有一张表,我喜欢在其中保存我的活动和脚本

表定义是:

IF OBJECT_ID('[dbo].[activity]') IS NOT NULL 
DROP TABLE [dbo].[activity] 
GO
CREATE TABLE [dbo].[activity] ( 
[dt]        DATE                             NOT NULL,
[i]         SMALLINT                         NOT NULL,
[activity]  NVARCHAR(max)                     NOT NULL,
[script]    NVARCHAR(max)                     NULL  
           CONSTRAINT [DF__activity__script__6E01572D] DEFAULT (NULL))

GO
CREATE CLUSTERED INDEX [pk_activity] 
   ON [dbo].[activity] ([dt] desc, [i] desc)
Run Code Online (Sandbox Code Playgroud)

由于该表位于DBADBA_SERVER服务器上的数据库中,因此我从本地计算机创建了一个linked server到该表,DBA_SERVER以便我可以将脚本插入到我的表中。

这就是我将脚本插入我的表的方式,该脚本位于我的本地机器上:

    INSERT INTO [MY_DBA_SERVER].[DBA].[dbo].[activity]
               ([dt]
               ,[i]
               ,[activity]
               ,[script])
    SELECT
               DT=cast ('3 may 2018' as date)
               ,I=1100
               ,ACTIVITY='MOVE APPLICATION ROWS - the Ids work'
               ,[script]=BulkColumn 
    FROM …
Run Code Online (Sandbox Code Playgroud)

sql-server blob openrowset sql-server-2016 bulk-insert

6
推荐指数
3
解决办法
3699
查看次数

链接服务器连接到多子网故障转移集群

我们最近将我们的 SQL Server 分发数据库迁移到了多子网故障转移集群,并且发现偶尔在从发布者添加文章/查看复制状态时,我们会收到如下错误:

无法为链接服务器“repl_distributor”初始化 OLE DB 访问接口“SQLNCLI11”的数据源对象。(.Net SqlClient 数据提供程序)

这似乎是由于链接服务器连接跟一个多子网故障转移群集(如所描述的在这里

除了遵循在我们发布者的每个节点(也是一个多子网故障转移集群)上实现 ODBC 连接的解决方案之外,还有什么我们可以尝试修复连接到多子网 FCI 的链接服务器吗?

sql-server sql-server-2016

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