标签: sql-server

这是 Oracle Where exists (Select NULL FROM...) 中的一种新的常见模式吗?

多年前,写

where exists (Select * from some_table where some_condition)
Run Code Online (Sandbox Code Playgroud)

去年我注意到许多 t-sql 脚本切换到使用数字 1 而不是星号

where exists (Select 1 from some_table where some_condition)
Run Code Online (Sandbox Code Playgroud)

就在所以我看到了这个 Oracle 示例

WHERE EXISTS (SELECT NULL FROM ...
Run Code Online (Sandbox Code Playgroud)

这是 Oracle 的常见模式吗?哪些是使用这样的东西的性能参数。

oracle sql-server style

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

完整计划缓存行为

在 SQL Server 2005 中,当计划缓存填满时会发生什么?我做了一些研究,从收集的点点滴滴来看,似乎缓存计划被赋予了一个“年龄”,其中包括它的重量或编译成本,乘以自缓存以来运行的次数。随着时间的推移,这个年龄递减,直到它达到 0,当它被认为“老化”并且是需要时冲洗的候选者。当计划缓存填满时,过时的计划将从缓存中刷新。

幕后是否还有其他事情使这种情况复杂化?

谢谢,

马特

sql-server-2005 sql-server

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

SQL Server IsShutdown 属性对于确定数据库是否处于良好状态有用吗?

我公司有一个工具可以监控服务器、服务、数据库等的状态。我们为我们的客户监控一些现场服务器。执行的一项特别简单的检查是通过查询某些数据库属性的值来确定 SQL Server 数据库是否处于“良好”状态。我们监控的四个数据库属性是:

  • 怀疑
  • 离线
  • 是紧急模式
  • 是关闭

这是我们使用的查询:

SELECT name AS [SuspectDB],
  DATABASEPROPERTY(name, N'IsSuspect') AS [Suspect],
  DATABASEPROPERTY(name, N'IsOffline') AS [Offline],
  ISNULL(DATABASEPROPERTY(name, N'IsShutdown'), 1) AS [Shutdown],
  DATABASEPROPERTY(name, N'IsEmergencyMode') AS [Emergency]
FROM sysdatabases
WHERE (DATABASEPROPERTY(name, N'IsSuspect') = 1)
   OR (DATABASEPROPERTY(name, N'IsOffline') = 1)
   OR (ISNULL(DATABASEPROPERTY(name, N'IsShutdown'), 1) = 1)
   OR (DATABASEPROPERTY(name, N'IsEmergencyMode') = 1)
Run Code Online (Sandbox Code Playgroud)

在测试升级到 SQL Server 2008 时,我们的许多数据库似乎都为IsShutdown属性返回了 1(真)值。SQL Server 2005 以前从未出现过这种情况。该属性的MSDN 文档只是说明“数据库在启动时遇到问题”。

据我所知,数据库非常好。它们已启动,可以查询等。没问题。

是否IsShutdown财产真正的问题对我的监视目的,即,它表明该数据库是在一个糟糕的状态?或者我应该从我的查询中删除它?

注意:在与我们的一位常驻 DBA 交谈时,他们发现在我们的一些新 SQL Server 2008 数据库上,启用IsAutoClose属性的事实可能与这些数据库的 …

sql-server

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

为什么在列上运行 ALTER TABLE 会导致它从 NOT NULL 变为 NULL?

我正在批量更新 SQL Server 数据库。我将所有numeric(38,0)列更改为int (是的,SQL Server 脚本是从 Oracle 脚本创建的)。使用 SMO 和 C# (我是一名软件工程师),我设法生成了非常好的脚本,就像SQL Server Management Studio那样。除了一个特定问题外,一切都非常好:

对于少数表格,当我调用ALTER TABLE [myTable] ALTER COLUMN [columnA] INT它时,它决定还将列从NOT NULL to NULL. 这当然是一个大问题,因为我需要为那些特定列上的大多数表重新生成主键。

显然,我有很多选择使用 SMO 来找出哪些列是主键,并在我更新数据类型之后或同时强制它们为 NOT NULL,但我真的很好奇是什么导致了这种情况。

sql-server-2005 sql-server-2008 sql-server

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

为什么这个 UDF 在这个检查约束中不起作用?

I\xe2\x80\x99m 尝试使用 UDF 作为在检查约束内使用 SELECT 命令的替代方法。我需要对报告表施加约束,以确保signedBy字段是人员记录的PK,该人员记录在auth表中存在一条记录,其人员编号和authType为8(这表明他们有权签署报告)。我的 UDF 应该检查这样的身份验证记录是否存在并返回一个位(如果不存在则返回 0,如果存在则返回 1)。我正在开发 SQL Server Express Edition。

\n

我几乎在SQLFiddle重新创建了我的情况:

\n
CREATE TABLE personnel(\n    personnel INT IDENTITY(1, 1) NOT NULL,\n    firstName VARCHAR(20), \n    lastName VARCHAR(20),\n    login VARCHAR(20) DEFAULT NULL,\n    title varchar(20) DEFAULT NULL,\n    initials varchar(4) NOT NULL,\n    startDate DATE DEFAULT GETDATE(),\n    CONSTRAINT PkPersonnel PRIMARY KEY(personnel),\n    CONSTRAINT UqPersonnelFirstNameLastName UNIQUE(firstName, lastName),\n    CONSTRAINT UqPersonnelInitials UNIQUE(initials)\n);\nCREATE TABLE authType(\nauthType INT NOT NULL IDENTITY(1, 1),\nauthName varchar(50)\nCONSTRAINT PkAuthTypeAuthType PRIMARY KEY(authType)\n);\nCREATE TABLE auth(\nauth INT NOT NULL IDENTITY(1, 1),\npersonnel INT NOT …
Run Code Online (Sandbox Code Playgroud)

sql-server functions check-constraints

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

使用递归标量 UDF 进行架构绑定

TL;博士; SQL Server 允许标量 UDF 在架构绑定时递归调用自身,但仅在使用语法进行更改时才这样做,这是否是一个错误CREATE OR ALTER?或者是其他语法被禁止的错误?


一个简单的递归标量 UDF 可以构造如下

CREATE FUNCTION dbo.Try1 (@i int)
RETURNS int
AS BEGIN
  RETURN IIF(@i = 0, 0, @i + dbo.Try1(@i - 1));
END;
Run Code Online (Sandbox Code Playgroud)

只要这不是架构绑定的,那么这是允许的。


让我们尝试模式绑定它,我们会做

CREATE FUNCTION dbo.Try2 (@i int)
RETURNS int
WITH SCHEMABINDING
AS BEGIN
  RETURN IIF(@i = 0, 0, @i + dbo.Try2(@i - 1));
END;
Run Code Online (Sandbox Code Playgroud)

没有。

Cannot find either column "dbo" or the user-defined function
or aggregate "dbo.Try2", or the name is ambiguous
Run Code Online (Sandbox Code Playgroud)

不使用递归创建它然后更改它

CREATE OR ALTER …
Run Code Online (Sandbox Code Playgroud)

sql-server functions recursive

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

在 SQL Server 中使用 select 来使用标准创建表时,收到“In Correct syntax around '('”错误消息

当我通过 Microsoft SQL Server Management Studio 使用 SQL Server 运行以下查询时,为什么会在本文的标题中出现错误?

-- create the dash_airports table
CREATE TABLE dash_airports 
    AS ( SELECT [Loc_Id], [ARP_Latitude], [ARP_Longitude], [Facility_Type], [Wind_Indicator] 
    FROM airportandrunway.dbo.Airports
    WHERE  [Loc_Id] IN ('09J','14A','18A','1V6','22S','2I0','YKM','YKN') );

Msg 102, Level 15, State 1, Line 3
Incorrect syntax near '('.
Run Code Online (Sandbox Code Playgroud)

我按照本指南文章中解决方案 2 的说明进行操作,但它显然不起作用。因此,作为健全性检查,我在 MySQL Workbench 中运行了它,它确实在那里工作了!是什么赋予了?

证明它在 Workbench 中有效: 在此输入图像描述

sql-server t-sql errors

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

如何使用这种模式有效地遍历图形数据?

我有一些体现有向无环图的关系,其中包括类似于以下内容的模式:

在此输入图像描述

我正在寻找一种有效的方法来遍历此图形数据。下面是计算节点 0 的后代的看似简单任务的示例:

数据库<>小提琴

DROP TABLE IF EXISTS #edges;
CREATE TABLE #edges(tail int, head int);
INSERT INTO #edges(tail,head) VALUES
    (0,1), (5, 6),  (10,11), (15,16),
    (0,2), (5, 7),  (10,12), (15,17),
    (1,2), (6, 7),  (11,12), (16,17),
    (1,3), (7, 8),  (11,13), (17,18),
    (2,3), (7, 9),  (12,13), (17,19),
    (2,4), (8, 9),  (12,14), (18,19),
    (3,4), (8,10),  (13,14),
    (3,5), (9,10),  (13,15),
    (4,5), (9,11),  (14,15),
    (4,6),          (14,16);
WITH descendents(node)
AS(
    SELECT 0 as node
    UNION ALL
    SELECT head as node FROM descendents as prior
    JOIN #edges …
Run Code Online (Sandbox Code Playgroud)

sql-server cte graph recursive

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

使用一半可用 CPU 核心的数据库实例

我正在考虑以下场景:

  • 在 Windows Server 2016 上运行的 MSSQL Server 2019 Standard。
  • sys.dm_os_schedulers 显示 12 个可用的逻辑 CPU 核心。
  • 这 12 个核心分布在 2 个插槽中。
  • 尽管它们位于 2 个套接字上,但它们似乎位于同一个 NUMA 节点上(服务器由 VMWare 虚拟化)(coreinfo 输出):
*-----------  Physical Processor 0
-*----------  Physical Processor 1
--*---------  Physical Processor 2
---*--------  Physical Processor 3
----*-------  Physical Processor 4
-----*------  Physical Processor 5
------*-----  Physical Processor 6
-------*----  Physical Processor 7
--------*---  Physical Processor 8
---------*--  Physical Processor 9
----------*-  Physical Processor 10
-----------*  Physical Processor 11

Logical Processor to …
Run Code Online (Sandbox Code Playgroud)

sql-server cpu sql-server-2019

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

由于 INSTEAD OF 触发器,OUTPUT 子句为新插入的标识值返回 0

考虑以下最小、完整且可验证的示例代码(请参阅此处的 dbfiddle):

CREATE TABLE [dbo].[test]
(
      [i] bigint NOT NULL 
        identity(1,1) 
        PRIMARY KEY CLUSTERED
    , [d] varchar(10) NOT NULL
);
GO
Run Code Online (Sandbox Code Playgroud)

使用INSTEAD OF INSERT, UPDATE触发器:

CREATE TRIGGER [dbo_test_trigger]
ON [dbo].[test]
INSTEAD OF INSERT, UPDATE
AS
BEGIN
    IF ROWCOUNT_BIG() = 0 RETURN;

    SET NOCOUNT ON;

    MERGE INTO [dbo].[test] [target]
    USING [inserted] [source] ON [target].[i] = [source].[i]
    WHEN NOT MATCHED THEN
        INSERT
        (
            [d]
        )
        VALUES 
        (
            [source].[d]
        )
    WHEN MATCHED THEN 
        UPDATE
        SET [target].[d] = [source].[d];
END; …
Run Code Online (Sandbox Code Playgroud)

trigger sql-server output-clause

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