标签: t-sql

获取上周某天的日期

在学习如何从前一周(例如从前一周的星期一的日期)获取星期几的日期时,我发现以下两个表达式很常见,您可以在其中更改最后一个数字(例如 0=星期一)取决于您想要的那一天:

SELECT DATEADD(wk, DATEDIFF(wk, 6, GETDATE()), 0)

SELECT DATEADD(wk, DATEDIFF(wk, 7, GETDATE()), 0)
Run Code Online (Sandbox Code Playgroud)

2017-05-29当我今天(2017-06-17)运行它时,两者似乎都返回了正确的日期。

我的问题是 - 这是如何工作的?似乎是在数周后67数周后1900-01-01?为什么它同时适用于 a67

此外,是否存在需要注意的边缘情况,它可能无法提供预期结果?

sql-server t-sql datetime

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

SQL Server 中是按批次还是按会话进行隐式事务?

想象一下,我正在通过管理工作室运行多个批次,由 GO 命令分隔。我想知道隐式事务的行为方式 - 事务是按批次提交还是在整个执行过程中提交一次。

sql-server t-sql transaction

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

权限更改sql server的审计登录触发器

在我的办公室,有人更改了用户对生产数据库的权限。所以在那之后我决定写一个 ddl 类型的触发器来审计权限更改。我已经用谷歌搜索了这个,但我找不到合适的解决方案。那么你们可以给我推荐几个链接或任何示例代码吗?

我想捕获谁更改了权限以及何时更改了权限。

提前致谢。

sql-server t-sql sql-server-2012

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

删除 SQLserver 中字符串行尾的点

如果 SQL 服务器中的字符串中存在,我想单独删除行尾的点。

例子:

ABC Private's co., ltd. 
Run Code Online (Sandbox Code Playgroud)

所需输出:

ABC Private's co., ltd
Run Code Online (Sandbox Code Playgroud)

sql-server t-sql

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

在 MS SQL Server 中正确使用 varbinary 类型

我在一个新职位上,被告知要实现一个存储过程,该过程将接受用户 ID 列表并更新一个标志。

当我建议使用表值参数(数组模拟)时,我被告知要实现如下所示,因为这是以前的做法。我不是 DBA,但我是一名全栈开发人员,这对我来说很有趣。

仅供参考 - 用户 ID 实现为类型 int

CREATE PROCEDURE [dbo].[UpdateUsers]       
 @rgIDs varbinary(max)      -- contains several ids
AS      
 DECLARE @tblTmp TABLE (ID int PRIMARY KEY)      

 DECLARE @ich int, @cch int, @ID int      
 SET @cch = DATALENGTH (@rgIDs)      
 SET @ich = 1   

 WHILE (@ich < @cch)      
 BEGIN      
  SET @ID = SUBSTRING (@rgIDs, @ich, 4) 

  UPDATE dbo.Users u 
  SET isUpdated = 1
  WHERE u.ID = @ID

  SET @ich = @ich + 4      
 END      
Run Code Online (Sandbox Code Playgroud)

不是表值类型在这里工作得更好吗?更具可读性、性能、更不容易出错等......?

我相信我将使用 SQL Server 2012 或 …

sql-server t-sql parameter array table-valued-parameters

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

获取另一个表中不包括时间间隔的数据

我有两张桌子,MessageBlockUser

Message

ID | Message | DateCreated 
1  | M1      | 2017-09-20 13:00:00
2  | M2      | 2017-09-20 14:00:00 
3  | M3      | 2017-09-21 13:00:00
4  | M3      | 2017-09-22 13:00:00
5  | M3      | 2017-09-23 13:00:00
6  | M3      | 2017-09-24 13:00:00
7  | M3      | 2017-09-25 13:00:00
Run Code Online (Sandbox Code Playgroud)

BlockUser

BlockStartDate       | BlockEndDate
2017-09-21 13:00:00  | 2017-09-22 13:00:00
2017-09-24 13:00:00  | 2017-09-24 14:00:00
Run Code Online (Sandbox Code Playgroud)

现在我想要Message排除那些与BlockUser. 所以对于我的例子,结果应该是:

ID | Message …
Run Code Online (Sandbox Code Playgroud)

sql-server t-sql

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

需要 LIKE 运算符和方括号方面的帮助

表列中的示例数据,数据类型NVARCHAR(MAX)。此数据由扩展事件跟踪捕获由实体框架生成的数据库调用收集。

exec sp_executesql N'SELECT TOP (2) 
    [Extent1].[ccusqcode] AS [ccusqcode], 
    [Extent1].[ccusname] AS [ccusname], 
    [Extent1].[ccusfirstname] AS [ccusfirstname], 
    [Extent1].[ccuslastname] AS [ccuslastname], 
    [Extent1].[dbirthday] AS [dbirthday], 
    [Extent1].[ccellphone] AS [ccellphone], 
    [Extent1].[cdriverlicense] AS [cdriverlicense], 
    [Extent1].[csocsecno] AS [csocsecno], 
    [Extent1].[dfirstvisit] AS [dfirstvisit], 
    [Extent1].[dlastvisit] AS [dlastvisit], 
    [Extent1].[nmtdrxcount] AS [nmtdrxcount], 
    [Extent1].[lduplabel] AS [lduplabel], 
    [Extent1].[cemployerid] AS [cemployerid], 
    [Extent1].[mnotes] AS [mnotes], 
    [Extent1].[cemployercontact] AS [cemployercontact], 
    FROM [dbo].[customer] AS [Extent1]
    WHERE ([Extent1].[cusid_PK] = @p__linq__0) AND ([Extent1].[pharminfoid_FK] = @p__linq__1)',N'@p__linq__0 bigint,@p__linq__1 bigint',@p__linq__0=NULL,@p__linq__1=1
Run Code Online (Sandbox Code Playgroud)

我想使用LIKE运算符查找所有带有 text 的行FROM [dbo].[customer]

SELECT * 
  FROM [dbname].[schemaName].[tableName]
  WHERE …
Run Code Online (Sandbox Code Playgroud)

sql-server t-sql sql-server-2012

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

神秘的条件 where 子句索引选择

你有没有解释一下,为什么查询优化器在这个例子中选择了不同的索引和模式?

/* crete objects and data for testing */

-- table
CREATE TABLE #Test (
    ID INT IDENTITY PRIMARY KEY
    ,CustNo INT NULL
    ,CustNo2 INT NULL
    );

-- populate with data
WITH
  L0   AS(SELECT 1 AS c UNION ALL SELECT 1),
  L1   AS(SELECT 1 AS c FROM L0 AS A CROSS JOIN L0 AS B),
  L2   AS(SELECT 1 AS c FROM L1 AS A CROSS JOIN L1 AS B),
  L3   AS(SELECT 1 AS c FROM L2 AS A CROSS JOIN …
Run Code Online (Sandbox Code Playgroud)

sql-server optimization t-sql execution-plan

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

SQL Server - Order by case 语句非常慢

我在执行正常的 SP 中有以下查询:

SELECT * FROM MyTable u
ORDER BY 
u.[Id] DESC
OFFSET @PageSize * (@PageNumber - 1) ROWS
FETCH NEXT @PageSize ROWS ONLY
Run Code Online (Sandbox Code Playgroud)

但是,当我从 SP 参数配置 ORDER BY 时,查询从以毫秒为单位执行到几秒:

SELECT * FROM MyTable u
ORDER BY 
CASE WHEN @Sort = 0 THEN u.[Id] END DESC,
CASE WHEN @Sort = 1 THEN u.[Id] END ASC,
CASE WHEN @Sort = 2 THEN u.[LastName] END ASC,
CASE WHEN @Sort = 3 THEN u.[LastName] END DESC
OFFSET @PageSize * (@PageNumber - 1) ROWS …
Run Code Online (Sandbox Code Playgroud)

sql-server t-sql

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

整理错误字符的问题

嗯,这个问题是众所周知的,但如果有的话,我正在寻找一个更聪明的解决方案。

出于某种原因,系统无法识别某些字符,我无法比较列

在此处输入图片说明

下面是一个文本示例:

ASPIRADOR ULTRASSONICO-LOCAÇAO (NOTA FISCAL SERVIÇO)

错误的

ASPIRADOR ULTRASSONICO-LOCA€AO (NOTA FISCAL SERVI€O)

其实我是通过这个功能来解决这个问题的

create function fixcollation(@ps_Texto VARCHAR(4000)) returns VARCHAR(4000) 

as 

begin  

    declare @vlgsv1itu INT declare @nxn68ezzi INT declare @dw17rsyva  VARCHAR(50) declare @iw8a2z01i VARCHAR(50) declare @t64e98xq6 VARCHAR(50) declare @zwjs2imy3 INT declare @jsyt85sy8 VARCHAR(4000)  

    ---------------------------------------------------- 

    set @dw17rsyva = ' …ƃ„µ·Ç¶Ž‚Šˆ‰ÔÒÓ¡‹ÖÞØ¢•ä“”àãå♣—–éëꚇ€§' 
    set @iw8a2z01i = 'áàãâäÁÀÃÂÄéèêëÈÉÊËíìïÍÌÏóòõôöÓÒÕÔÖúùûüÚÙÛÜçǺØ' 
    set @jsyt85sy8 = @ps_Texto set @zwjs2imy3 = IsNull(datalength(@ps_Texto), 0) 
    set @nxn68ezzi = 1 
    while(@nxn68ezzi <= IsNull(datalength( @ps_Texto), 0)) 

    begin 

        set @vlgsv1itu = 1 

        while(@vlgsv1itu <= …
Run Code Online (Sandbox Code Playgroud)

sql-server collation t-sql character-set encoding

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