标签: t-sql

查询以从仅包含开始日期的列表计算开始和结束日期

我有以下形式的数据需要合并,以便我从两行输入数据创建一行,其中第二列是下一行减去一天的值。

我一直在努力想出一种方法来做到这一点,但没有走得太远。我希望这张图能解释这个问题:

表结构

CREATE TABLE Process(
    ProcessOrder int NOT NULL IDENTITY (1, 1),
    ProcessDate date NOT NULL
);
Run Code Online (Sandbox Code Playgroud)

询问

SELECT ProcessOrder, ProcessDate From Process ORDER BY ProcessOrder;
Run Code Online (Sandbox Code Playgroud)

数据

ProcessOrder  ProcessDate
------------  -----------
208           2016-01-04
209           2016-01-11
210           2016-01-18
211           2016-01-25
212           2016-02-01
213           2016-02-08
Run Code Online (Sandbox Code Playgroud)

我需要将上述数据变成以下形状(注意,从后续记录来看,ProcessEnd 比 ProcessBegin 少一天):

ProcessOrder  ProcessBegin  ProcessEnd
------------  ------------  ----------
208           2016-01-04    2016-01-10
209           2016-01-11    2016-01-17
210           2016-01-18    2016-01-24
211           2016-01-25    2016-01-31
212           2016-02-01    2016-02-07
213           2016-02-08    *NULL*
Run Code Online (Sandbox Code Playgroud)

编辑

我保证 ProcessOrder 列中的值是连续的,没有缺失值。

sql-server t-sql sql-server-2008-r2

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

TRY .. CATCH 有时无法捕获主键违规

我编写了代码将记录更新到数据库。数据库是Azure DB,S4层。

更新和插入有时是高度并发的,因为它来自执行太多更新的应用程序。

该代码在大多数情况下都能成功运行,但有时会抛出 2627 异常(在 CATCH 语句内部处理)。到目前为止还无法弄清楚可能是什么问题。

我可以用 MERGE 语句替换它,但是我不太喜欢它,并且还想弄清楚这个 try and catch 发生了什么。

SET nocount ON;
IF NOT EXISTS(SELECT * FROM MyTable WHERE ID = @ID)
BEGIN TRY
INSERT INTO Table(ID, Value, TimeChanged) VALUES (@id, 'xxx', GETDATE())
END TRY
BEGIN CATCH
IF @@Error <> 2627 ----Violation of PRIMARY KEY constraint
THROW;
END CATCH

UPDATE MyTable SET Value = 'xxx' WHERE ID = @ID AND TimeChanged < GETDATE()

Run Code Online (Sandbox Code Playgroud)

sql-server t-sql azure-sql-database azure

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

逻辑读取次数 8KB 超过实例内存

我正在开发 SQL Server 实例并使用 Redgate SQL Monitor。我在前 10 个列表中看到一个执行了 1 次的查询,该查询的逻辑读取量比实例的内存多出约 100 倍,而且查询的持续时间只有几分钟。这怎么可能?我的意思是8KB页面乘以逻辑读取次数怎么会比内存多呢?我不明白是什么?

谢谢

sql-server t-sql

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

在哪里可以检查某个 T-SQL 函数在特定版本中是否可用?

在哪里可以找到列表来确保我正在使用的函数在旧版本的 Microsoft SQL Server 中可用?

我们最近遇到了有人使用 CONCAT 的问题,它无法在我们的一些旧服务器上运行。

t-sql

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

SQL COUNT LEFT JOIN 上列值的出现次数

我在这里似乎有类似的问题,但似乎没有一个答案符合我正在寻找的-

假设我有一张这样的桌子:

分配给 部门ID 类型
玛丽 5001 初级
鲍勃 5002 中间
鲍勃 5003 初级
吉尔 5004 高的
鲍勃 5005 高的
鲍勃 5006 高的

另一个像这样:

用户 电话 地址
玛丽 111-222-3333 南巷111号
鲍勃 222-111-3333 北大道222号
吉尔 333-222-1111 555公路

我想在第一个表上输出带有左连接的第二个表,其中包含每个指定用户的“类型”总数(基本、中、高),因此它需要类似的内容:

用户 电话 小学总计 总中 总高
玛丽 111-222-3333 1 0 0
鲍勃 222-111-3333 1 1 2
吉尔 333-222-1111 0 0 1

我已经尝试过--Count(case when <table>.[type] = 'Elementary' then 1 else 0 end) AS ElementaryCount,,但这只是让我获得整个表,而不是左连接的用户。

有人知道我该怎么做吗?

join sql-server t-sql count

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

SQL Server 过程,查找和替换大表中的数据

我需要编写一个存储过程来更新数据库中的链接引用。链接可以包含在几个包含 JSON 的 nvarchar 字段中(可能包含一些 url)。

为此,我每次迭代分批更新表 8129 个项目,这样机器就不会挂起(理论上)。

但现在代码似乎无论如何都挂起,它不会打印任何消息,并且程序继续运行(不影响任何数据)很多分钟,直到我必须终止该程序(同时似乎没有影响任何数据) 。

如果我尝试在玩具示例上使用相同的逻辑,我不会遇到任何问题,所以我认为我的问题是由于表很大(几十万行)这一事实造成的。

这里是一个正在运行的最小示例,更大的表上完全相同的代码显然没有执行任何操作(使用 SQL Server 2019 进行测试)。

程序代码:

ALTER PROCEDURE [dbo].[SiteUrlChangeURL]
    @FullOldUrl nvarchar(500),
    @FullNewUrl nvarchar(500)
AS
BEGIN
    -- SET NOCOUNT ON added to prevent extra result sets from
    -- interfering with SELECT statements.
    SET NOCOUNT ON;

    SET @FullOldUrl = ISNULL(@FullOldUrl,'');
    SET @FullNewUrl = ISNULL(@FullNewUrl,'');

    IF ( LEN(@FullOldUrl) <= 0 OR LEN(@FullNewUrl) <= 0 )
    BEGIN 
        PRINT('Invalid parameters');
        RETURN 1;
    END

    --ARTICLE
    RAISERROR ('updating articles',0,1) WITH NOWAIT;
    WHILE 1=1
    BEGIN
        UPDATE …
Run Code Online (Sandbox Code Playgroud)

sql-server stored-procedures t-sql replace

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

如何区分运行时错误和其他错误?

请考虑以下错误消息。

消息 207 级别 16 状态 1 第 7 行

列名“FOO”无效。

由于我触发它的方式,我碰巧知道这是一个解析/编译时错误。

假设我正在运行一个不属于过程的长脚本,并且我收到了相同的错误消息。此错误消息中的内容告诉我错误是在解析/编译时而不是运行时发生的?


CREATE TABLE Department_History
(
    DepartmentNumber INT
);
GO

ALTER TABLE Department_History ADD FOO INT;

-- This is fine and shows FOO.
SELECT * FROM Department_History;

-- When uncommented, this fails at parse time.
INSERT Department_History (DepartmentNumber, FOO) VALUES (4, 5), (6, 7), (8, 9);
Run Code Online (Sandbox Code Playgroud)

sql-server t-sql errors

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

T-SQL 将当前时间向下舍入到最后 15 分钟时间段

我想选择过去 15 分钟内的数据,例如:

在 12.02 我想要从 11:45 到 12:00 的行

在 12.09 我仍然想要从 11:45 到 12:00 的行

在 12.18 我想要从 12:00 到 12:15 的行

数据以datetime2格式存储,我使用的是2019标准版。感谢任何帮助让我开始。规范稍后可能会更改(例如,10 分钟而不是 15 分钟),但我希望能够自己解决这个问题。

谢谢

sql-server t-sql

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

修改T-SQL获取结果

我是业余爱好者。

我正在尝试以下

select * from [dbo].[AccessFeeDetail]
where LastLoginDate >= '10/15/2012 00:00:00.000', jobname not like 'Uptest_%'
Run Code Online (Sandbox Code Playgroud)

我在 where 子句上犯了一个错误。你能纠正我吗

“LastLoginDate”和“JobName”是同一个表中的字段。

谢谢!

t-sql

0
推荐指数
1
解决办法
85
查看次数

在部分字符串匹配上连接表

输入:我有一个包含(任意数量)用户提供的字符串的表:

?????????
? Value ?
?????????
? To    ?
? An    ?
?????????
Run Code Online (Sandbox Code Playgroud)

以及用户详细信息表:

?????????????????????
? UserID ? UserName ?
?????????????????????
?     12 ? Tom      ?
?    132 ? Ann      ?
?     32 ? Dina     ?
?      2 ? Mark     ?
?????????????????????
Run Code Online (Sandbox Code Playgroud)

我需要一个查询来返回用户表中的所有记录,其中UserNameValue输入表中任何记录的部分字符串匹配。这种情况下的预期输出是:

?????????????????????
? UserID ? UserName ?
?????????????????????
?     12 ? Tom      ?
?    132 ? Ann      ?
?????????????????????
Run Code Online (Sandbox Code Playgroud)

join sql-server t-sql

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