标签: t-sql

DBCC CHECKIDENT('表名',RESEED,20000)不工作

当我运行脚本时

DBCC CHECKIDENT ('table name', RESEED, 20000)
Run Code Online (Sandbox Code Playgroud)

消息的输出是

检查标识信息:当前标识值“200000”,当前
列值“200000”。DBCC 执行完成。如果 DBCC 打印错误
消息,请联系您的系统管理员。

当我通过运行查询身份值时

SELECT IDENT_CURRENT('table_name')
Run Code Online (Sandbox Code Playgroud)

它按预期显示为 200000,但是,当开发人员将记录插入表中时,它没有使用新的重新设定值。

有什么明显的我遗漏了吗?

sql-server t-sql

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

如何按时间采样记录

所以我在 SQL Server 2014 中有一个存储事件的表。事件的生成速度不超过每 10 秒一次,但可能会慢得多(事件之间的几分钟或几小时)。事件之间的时间并不统一。

我想按时间对记录进行抽样。
例如,我想要求一个 10 分钟的采样 - 所以它会抓取记录 1,下一条记录应该是至少 10 分钟后的记录,然后下一条记录至少比第 2 行晚 10 分钟, 等等。

我可以通过迭代方法来实现这一点,循环遍历每条记录,但我想让数据库来完成这项工作。问题是,我不知道如何使用 T-SQL set/window 语句来做到这一点。

谁能帮我吗?

示例数据:

EventID | RecordTime
--------+--------------------
   1    | 2017-04-01 12:00:00
   2    | 2017-04-01 12:00:10
   3    | 2017-04-01 12:00:20
   4    | 2017-04-01 12:00:32
   5    | 2017-04-01 12:05:42
   6    | 2017-04-01 12:09:00
   7    | 2017-04-01 12:24:12
   8    | 2017-04-01 12:36:46
   9    | 2017-04-01 12:36:57
  10    | 2017-04-01 15:00:00
Run Code Online (Sandbox Code Playgroud)

想要的结果:

EventID | RecordTime
--------+--------------------
   1    | 2017-04-01 12:00:00 …
Run Code Online (Sandbox Code Playgroud)

sql-server t-sql sql-server-2014

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

关于“统计IO”输出的问题

  • 查询的物理读取总数 = [物理读取] + [预读]?
  • 为什么有时我们有[物理读取]=0 而[预读]>0?这意味着什么?
  • SQL Server 在一次物理读取中读取了多少页?...如果是一对一,那么
  • 为什么当“select * from aTable”时,[物理读取]和/或[预读]的数量不等于表的页数?尽管在执行查询之前清除了缓存。
  • 为什么有时[逻辑读]大于[物理读]+[预读],甚至大于表的总页数?

sql-server t-sql

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

SQL PRINT 语句不打印任何内容

我没有得到这个简单PRINT语句的任何输出。我错过了什么?

sqlfiddle 中提供的数据

DECLARE @team varchar(20)

BEGIN
   SELECT @team = TEAM
   FROM DISTRIB_LINE 
   PRINT 'value is' + @team
END
Run Code Online (Sandbox Code Playgroud)

sql-server stored-procedures t-sql

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

更新列的 T-SQL 触发器

我已经使用 SQL 查询几个星期了,我正在尝试从错误中学习和理解。我有两列的表IsInvisible (bit)ShortName (string)当一个被改变为更新的另一个也如: -如果添加〜于SHORTNAME到组的前面IsInvisible为1,并且如果〜被去除,以将其设置为0 -如果IsInvisible被设置为1 在 ShortName 前面添加 ~ 并在设置为 0 时将其删除。

我试过这样的事情:

ALTER TRIGGER [dbo].[updateInvisibility]
ON [dbo].[table]
AFTER UPDATE
AS
BEGIN

UPDATE t
SET IsInvisible = (CASE WHEN i.ShortName like '~%' THEN 1 ELSE 0 END),
    ShortName = (CASE WHEN i.IsInvisible = 1 AND t.ShortName NOT LIKE '~%'
                 THEN '~' + t.ShortName
                 ELSE t.ShortName
            END)
FROM table t JOIN
     inserted i
     ON t.Id = i.Id;

end
Run Code Online (Sandbox Code Playgroud)

我的问题是,当我更新其中一列或同时更新两列时,没有任何反应,并且出现此错误:

Maximum stored …
Run Code Online (Sandbox Code Playgroud)

trigger sql-server t-sql

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

为什么 SQL Optimizer 不使用我的约束?

我想创建一个带有NOT NULLbool 列的表。
我用TINYINTCHECK约束BETWEEN 0 and 1。约束是新的,因此是可信的

现在我希望 SQL 优化器现在知道这个列只能是 0 和 1,所以当我写查询时,col >= 2我会在实际执行计划中看到常量扫描(就像我在检查NULLSELECT TOP (0)

但事实并非如此,它选择了表扫描。我还需要在此列上建立索引吗?

在我下面的测试中,我使用TINYINTCHECK约束。用户定义类型基于TINYINTwith boundRULE和 good old BIT

GO
CREATE TYPE dbo.myBool 
FROM [INT] NOT NULL
GO

CREATE RULE dbo.R_Bool AS @value BETWEEN 0 AND 1
go

EXEC sys.sp_bindrule @rulename = N'R_Bool'
                   , @objname = N'myBool'
GO 


DROP TABLE IF EXISTS dbo.RuleTest
CREATE …
Run Code Online (Sandbox Code Playgroud)

t-sql sql-server-2016

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

有时更新的行没有被锁定而不是更新触发器

这是一个小的repro:

create table dbo.t (id int primary key, v int);
insert into dbo.t values (1, 1), (2, 2);

create table dbo.s (id int primary key, v int);
insert into dbo.s values (1, 10);
go

create trigger dbo.tr_t__iou
on dbo.t
instead of update
as
begin
 set nocount on;

 exec sp_lock @@spid;
end;
go

update dbo.t set v = 10 where id = 1;

update t
 set
  v = 10
from
 dbo.s s join
 dbo.t t on t.id = s.id;

update t …
Run Code Online (Sandbox Code Playgroud)

trigger sql-server t-sql locking

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

防止存储过程写入数据库

我是一名数据库开发人员,主要编写 SSRS 报告。我想创建存储过程并向 DBA 保证这些存储过程无法写入生产数据库,而 DBA 不必仔细检查存储过程。

我在 DatabaseA 中创建存储过程。我需要存储过程来选择 DatabaseB 中的数据。

我希望任何用户都能够安全地执行 DatabaseA 中的存储过程,但无法使用该存储过程在 DatabaseB 中插入/更新/删除数据,无论用户可能拥有的任何其他权限如何。

DBA 能否在数据库或过程级别设置权限来强制执行此操作?

这是针对 SQL Sever 2016 的。

sql-server permissions t-sql

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

这段 TSQL 是如何工作的?

为什么下面的批次不能按预期工作?

DROP TABLE IF EXISTS #test1;

IF 1 = 1
    SELECT *
    INTO #test1
    FROM sys.databases
    WHERE database_id <= 5;

ELSE
    SELECT *
    INTO #test1
    FROM sys.databases;


SELECT *
FROM #test1;
Run Code Online (Sandbox Code Playgroud)

当我运行它时,我得到:

消息 2714,级别 16,状态 1,第 12 行 数据库中已有一个名为“#test1”的对象。

我必须像这样更改代码:

DROP TABLE IF EXISTS ##test1;

IF 1 = 1
    EXEC ('
    SELECT *
    INTO ##test1
    FROM sys.databases
    WHERE database_id <= 5;
    '    );

ELSE
    EXEC ('
    SELECT *
    INTO ##test1
    FROM sys.databases;');


SELECT *
FROM ##test1;
Run Code Online (Sandbox Code Playgroud)

这按预期工作。上述错误似乎是一个解析错误,我不确定。谁能帮忙解释一下这里发生了什么?

sql-server t-sql errors

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

将表(及其所有数据)从一台服务器复制到另一台服务器的惯用方法是什么?

我有一个巨大的表,假设有 500,000 行。我想将其(架构和数据)从一台服务器复制到另一台服务器。这不是更新插入或任何类型的更新;这是一次性的直接复制和粘贴。对此的惯用方法是什么?

我试过了:

  • 将备份从一台服务器恢复到另一台服务器。这是不切实际的,因为众所周知,SQL Server 无法从备份中恢复表。它只能恢复数据库。而且我的数据库很大!
  • 使用 SSMS 将表数据编写为 INSERT 语句序列。这是不切实际的,因为插入必须逐行完成,令人痛苦。我怀疑这也会对事务日志造成可怕的影响,但还没有人因此攻击我(我现在正在运行这样的脚本,这将需要几个小时)。

sql-server etl bulkcopy t-sql bulk-insert

7
推荐指数
3
解决办法
1295
查看次数