标签: sql-server

在 Windows 11 上启动 localDb 时出错

我在全新的 NUC 上安装了 Windows 11,然后安装了所有更新。安装Visual Studio 2022 CESSMS (v 18.10)

\n

我尝试启动 localDB,假设它是作为 Visual Studio 2022/SSMS 的一部分安装的,当(localdb)\\mssqllocaldb在 SSMS 中输入\xc2\xa0 时,它收到错误\xc2\xa0

\n
Cannot connect to (localdb)\\mssqllocaldb.\n\nSQL Network Interfaces, error: 50 - Local Database Runtime error occurred.\xc2\xa0\n\nError Number: -1983577846\n
Run Code Online (Sandbox Code Playgroud)\n

然后我验证/尝试启动实例,如下所示

\n
sqllocaldb stop mssqllocaldb\nsqllocaldb delete mssqllocaldb\nsqllocaldb start "MSSQLLocalDB"\n
Run Code Online (Sandbox Code Playgroud)\n

当输入最后一个命令时,我收到错误\xc2\xa0

\n

由于以下错误,LocalDB 实例“MSSQLLocalDB”启动失败:\n无法创建自动实例。有关错误详细信息,请参阅 Windows 应用程序事件日志。

\n

我查看了下找到的日志文件

\n

....\\AppData\\Local\\Microsoft\\Microsoft SQL Server 本地 DB\\Instances\\MSSQLLocalDB

\n

并查看一些错误文件并按日期选择最新的一个。

\n

它包含信息,最后一行是\xc2\xa0

\n
2021-12-11 10:48:42.67 spid10s \xc2\xa0 \xc2\xa0 There have been …
Run Code Online (Sandbox Code Playgroud)

sql-server ssms visual-studio sql-server-localdb

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

使用带参数的 sp_executesql 如何防止 SQL 注入?

以下是使用sp_executesql的动态过滤解决方案

IF OBJECT_ID(N'dbo.GetOrders', N'P') IS NOT NULL DROP PROC dbo.GetOrders;
GO
CREATE PROC dbo.GetOrders
 @orderid AS INT = NULL,
 @custid AS INT = NULL,
 @empid AS INT = NULL,
 @orderdate AS DATE = NULL
AS
DECLARE @sql AS NVARCHAR(1000);
SET @sql = 
 N'SELECT orderid, custid, empid, orderdate, filler'
 + N' /* 27702431-107C-478C-8157-6DFCECC148DD */'
 + N' FROM dbo.Orders'
 + N' WHERE 1 = 1'
 + CASE WHEN @orderid IS NOT NULL THEN
 N' AND orderid = @oid' ELSE N'' END …
Run Code Online (Sandbox Code Playgroud)

sql-server sql-injection dynamic-sql

8
推荐指数
2
解决办法
3021
查看次数

为什么 OPTION RECOMPILE 会导致谓词下推?

我有一个 SQL 查询,它是由一堆嵌套的视图和表值函数组成的,深度至少为 4 层(我没有时间或耐心去完成这一切,它有数百行代码在每个级别)。

我一直试图理解为什么当我使用选项(重新编译)运行基本查询时它运行得非常快,但是当我在没有这个选项的情况下运行它时,它运行得非常慢。

我已确保在发生这种情况之前清除计划缓存,即使在生成新计划时,它也不是最佳的,但是,选项(重新编译)速度很快。

我检查了这两个计划,并注意到对于带有选项(重新编译)的计划,传递的参数。

SELECT [p].[Activity]
    ,[p].[ActivityType]
    ,[p].[Company]
    ,[p].[Flags]
    ,[p].[Id]
    ,[p].[Name]
    ,[p].[Priority]
    ,[p].[Filters]
    ,[p].[Priority]
    ,[p].[Classification]
    ,[p].[Number]
    ,[p].[TaskFilter]
    ,[p].[TaskType]
    ,[p].[User]
FROM (
    SELECT *
    FROM [ActivProdStatuses]('ProdJobTask', 0)
    ) AS [p]
WHERE (
        (   ([p].[User] = 'some_value') AND (([p].[Flags] & 8) = 0) ) 
           AND ([p].[Activity] = 'unique_value') 
        )
    AND  
      (CASE 
        WHEN ([p].[Flags] & 4) <> 0
         THEN CAST(1 AS BIT)
         ELSE CAST(0 AS BIT)
       END = 1 )
ORDER BY [p].[Priority]
OPTION (RECOMPILE)
Run Code Online (Sandbox Code Playgroud)

在没有 OPTION …

sql-server execution-plan azure-sql-database recompile query-performance

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

使用扩展事件跟踪单个存储过程

我正在尝试跟踪存储过程的所有执行(包括来自其他存储过程内部)以及该过程的语句 - 这对于扩展事件是否可能?我当前的扩展活动是:

CREATE EVENT SESSION [EVENT_NAME] ON SERVER
ADD EVENT sqlserver.rpc_completed(SET collect_data_stream=(1)
ACTION(sqlserver.database_id,sqlserver.database_name,sqlserver.server_principal_name,sqlserver.session_id)
WHERE ([package0].[greater_than_uint64]([sqlserver].[database_id],(4)) AND [package0].[equal_boolean]([sqlserver].[is_system],(0)) AND [sqlserver].[like_i_sql_unicode_string]([sqlserver].[sql_text],N'%MY_STORED_PROCEDURE_NAME%'))),
ADD EVENT sqlserver.sp_statement_completed(
ACTION(sqlserver.database_id,sqlserver.database_name,sqlserver.server_principal_name,sqlserver.session_id)
WHERE ([package0].[greater_than_uint64]([sqlserver].[database_id],(4)) AND [package0].[equal_boolean]([sqlserver].[is_system],(0)) AND [sqlserver].[like_i_sql_unicode_string]([sqlserver].[sql_text],N'%MY_STORED_PROCEDURE_NAME%'))),
ADD EVENT sqlserver.sql_batch_completed(
ACTION(sqlserver.database_id,sqlserver.database_name,sqlserver.server_principal_name,sqlserver.session_id)
WHERE ([package0].[greater_than_uint64]([sqlserver].[database_id],(4)) AND [package0].[equal_boolean]([sqlserver].[is_system],(0)) AND [sqlserver].[like_i_sql_unicode_string]([sqlserver].[sql_text],N'%MY_STORED_PROCEDURE_NAME%')))
ADD TARGET package0.event_file(SET filename=N'TraceData')
WITH (MAX_MEMORY=4096 KB,EVENT_RETENTION_MODE=ALLOW_SINGLE_EVENT_LOSS,MAX_DISPATCH_LATENCY=30 SECONDS,MAX_EVENT_SIZE=0 KB,MEMORY_PARTITION_MODE=NONE,TRACK_CAUSALITY=ON,STARTUP_STATE=OFF)
GO
Run Code Online (Sandbox Code Playgroud)

但这似乎不起作用,除非我手动执行该过程。有什么最佳实践方法可以做到这一点?

sql-server extended-events

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

我可以向扩展事件添加什么以返回正确的 row_counts?

我正在 SQL Server 2017 中运行扩展事件会话,该会话仅记录module_end特定数据库的事件。出现此痕迹的原因有两个:

  1. 我想查看调用存储过程的频率(或缺乏频率)。
  2. 我试图获取每个过程调用的一些细节(例如谁调用它、从哪里调用、花费了多长时间、返回了多少记录等)。

在查看一些结果时,我注意到列表中的一些过程执行了数千万次,但从来没有一次大于row_count0。还有很多其他记录的事件row_count似乎填充正确,因此我最初认为那些从未返回结果的应用程序被引用它们的应用程序错误调用了。然而,事实并非如此。

为了更好地查看调用过程所使用的参数,我启动了一个 Profiler 会话,仅监视这些过程调用。我正在检查的特定过程被非常频繁地调用,并且我很快就收到了大量示例调用,并关闭了探查器。从中注意到以下几点:

  1. 这些调用具有合法的参数。
  2. 在未对扩展事件会话进行任何更改的情况下,在探查器处于活动状态期间记录的过程调用神奇地开始row_count正确记录1为而不是0

以下是我正在使用的扩展事件的定义:

Create Event Session [Test Event] On Server
    Add Event sqlserver.module_end
    (
        Action (sqlserver.database_name, sqlserver.session_id)
        Where
        (
            sqlserver.database_name = N'TestDatabase' 
        And object_type = 'P'
        )
    )
    Add Target package0.ring_buffer (Set max_events_limit = 10000, max_memory = 51200)
    With
    (
        Max_Memory = 4096KB,
        Event_Retention_Mode = Allow_Single_Event_Loss,
        Max_Dispatch_Latency = 30 Seconds,
        Max_Event_Size = 0KB,
        Memory_Partition_Mode = None, …
Run Code Online (Sandbox Code Playgroud)

sql-server profiler extended-events sql-server-2017

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

索引查找特定的多列键,然后按字典顺序获取一些行

考虑以下具有多列索引的示例表:

create table BigNumbers (
    col1 tinyint not null,
    col2 tinyint not null,
    col3 tinyint not null,

    index IX_BigNumbers clustered (col1, col2, col3)
)

DECLARE @n INT = 100;

DECLARE @x1 INT = 0;
DECLARE @x2 INT = 0;
DECLARE @x3 INT = 0;

SET NOCOUNT ON;

WHILE @x3 <= @n BEGIN
    SET @x2 = 0;
    WHILE @x2 <= @n BEGIN
        SET @x1 = 0;
        WHILE @x1 <= @n BEGIN
            insert into BigNumbers values (@x1, @x2, @x3);
            SET @x1 = …
Run Code Online (Sandbox Code Playgroud)

index sql-server btree

8
推荐指数
2
解决办法
951
查看次数

当我有索引时为什么要进行排序?

Azure SQL 数据库。

我有一个表,我需要从中获取Col1Col2基于 的第一行和最新行CreateDate

CREATE TABLE dbo.table1 (
    Id            INT    IDENTITY(1,1) PRIMARY KEY ,
    Col1        VARCHAR(255) COLLATE SQL_Latin1_General_CP1_CS_AS NOT NULL ,
    Col2        VARCHAR(255) COLLATE SQL_Latin1_General_CP1_CS_AS NOT NULL ,
    CreateDate    DATETIME NOT NULL
) ;
Run Code Online (Sandbox Code Playgroud)

我有一个像这样的索引:

CREATE INDEX IX__table1_ASC
ON dbo.table1 (Col1, Col2, CreateDate );
Run Code Online (Sandbox Code Playgroud)

我获取第一行的查询是(计划在这里):

--Get the first row
SELECT    TOP (1) WITH TIES
        *
FROM    table1
ORDER BY ROW_NUMBER()
        OVER (PARTITION BY Col1, Col2
              ORDER BY CreateDate );
Run Code Online (Sandbox Code Playgroud)

索引扫描使用我创建的索引 ( …

sql-server optimization execution-plan azure-sql-database query-performance

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

为什么在集群列存储上构建统计数据的速度较慢?

即使我要求一个小样本,在聚集列存储表上构建统计信息似乎总是会读取整个表。为什么是这样?

sql-server statistics columnstore

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

从 XML 返回可变数量的属性作为逗号分隔值

过度延伸

在阻塞进程报告和死锁 XML 的 SQL Server 扩展事件中,可以获取多个 SQL 句柄值以识别引发事件中涉及的查询。

由于可能涉及 1 个或多个 SQL 句柄,因此可靠地查询 XML 以检索所有这些句柄可能会很困难,并且还会使更简单的 XQuery 不正确,因为它仅检索第一个存储的值。

sqlhandle = bd.value('(process/executionStack/frame/@sqlhandle)[1]', 'varchar(130)'),
Run Code Online (Sandbox Code Playgroud)

用于说明的示例 XML 片段如下所示:

<executionStack>
      <frame line="1" stmtend="108" sqlhandle="0x020000008d18260040e407ba48fc247b0cb6121c21c2cf2b0000000000000000000000000000000000000000" />
      <frame line="1" stmtend="108" sqlhandle="0x02000000dd847b18dcaa4a09a89f56595186fcf91da8a7f70000000000000000000000000000000000000000" />
</executionStack>
Run Code Online (Sandbox Code Playgroud)

此 SQL Fiddle提供了更完整的示例。

我已经做到了这一点:

SELECT 
    sql_handle = 
        @x.query('for $s in //executionStack/frame return $s');  
Run Code Online (Sandbox Code Playgroud)

但这并没有得到我所追求的。扩展该查询以使用该@sqlhandle属性会引发错误:

SELECT 
    sql_handle = 
        @x.query('for $s in //executionStack/frame/@sqlhandle return $s');  
Run Code Online (Sandbox Code Playgroud)

消息 2396,级别 16,状态 1,第 60 行 XQuery [query()]:属性不得出现在元素外部

我怎样才能像这样查询 XML 以将所有列出的 SQL 句柄作为逗号分隔列表返回?

xml sql-server extended-events xquery

8
推荐指数
2
解决办法
696
查看次数

SQL Modulo 函数给出了错误的值?

在 Javascript、Excel、Python 和科学计算器中,模运算

-34086.1576962834 % 360.0      <-- python
=MOD(-34086.1576962834, 360.0) <-- Excel function
Run Code Online (Sandbox Code Playgroud)

给出一个值113.84230371659942. (或者非常接近的东西,取决于小数位数和四舍五入。)

但在 T-SQL 中,

Select -34086.1576962834 % 360.0
Run Code Online (Sandbox Code Playgroud)

返回值-246.1576962834.

我尝试过使用

Select cast(-34086.1576962834 as numeric(30,15)) % cast(360.0 as numeric(30,15))
Run Code Online (Sandbox Code Playgroud)

我在想,这可能是浮点与固定十进制数学不匹配的一个例子,但这并不能解决问题。

为什么 SQL Server 不以与计算器/预期结果一致的方式执行此操作?更重要的是,有没有办法让 T-SQL 像我的计算器一样进行算术运算?

我主要使用 SQL Server 2019,但我已经确认 SQL Server 2012 和 2014 也给出相同的 -246... 结果。

Oracle 函数mod(x,y)和 pythonmath.fmod(x,y)给出相同的 -246.nnn 结果。

sql-server t-sql

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