标签: t-sql

“和”与“&”的区别

我试图了解逻辑运算的优先顺序并具有以下代码:

declare @T bit ='TRUE'
declare @F bit ='False'

print @T and @F
Run Code Online (Sandbox Code Playgroud)

它返回一个错误

关键字“and”附近的语法不正确。

我用“&”替换了“and”,代码再次运行。为什么以前的代码不起作用?我正在使用 SQL 服务器。

sql-server t-sql

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

克服 LIKE 字符长度限制

通过在此处阅读此LIKE 字符长度限制,看起来我无法在 LIKE 子句中发送超过 ~4000 个字符的文本。

我正在尝试从特定查询的查询计划缓存中获取查询计划。

SELECT *
FROM sys.dm_exec_cached_plans AS cp 
CROSS APPLY sys.dm_exec_query_plan(cp.plan_handle) AS qp 
CROSS APPLY sys.dm_exec_sql_text(cp.plan_handle) AS st
where st.text like '%MY_QUERY_LONGER_THAN_4000_CHARS%' ESCAPE '?'
Run Code Online (Sandbox Code Playgroud)

如果里面的查询LIKE超过 4000 个字符,那么即使我的查询在缓存计划中,我也会得到 0 个结果。(我期待至少有一个错误)。

有没有办法解决这个问题或采取不同的方式?我有可能是 >10000字符长的查询,看起来我无法通过LIKE.

sql-server t-sql like sql-server-2016

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

这个 WHERE 子句中的 % 有什么作用?

我正在接受培训,其中一个脚本具有以下命令:

SELECT SUM(Col2) FROM clust_table WHERE Col1 % 3 = 1
Run Code Online (Sandbox Code Playgroud)

我想知道这个片段在 WHERE 子句中的用途: Col1 % 3 = 1

我在互联网上做了一些研究,没有找到关于这个命令的参考。

sql-server t-sql

13
推荐指数
3
解决办法
6172
查看次数

GETUTCDATE()-2 与 DATEADD(d,-2,GETUTCDATE())

我想知道以下两种方法之间的区别是什么:

 GETUTCDATE()-2  
Run Code Online (Sandbox Code Playgroud)

  DATEADD(d,-2,GETUTCDATE())
Run Code Online (Sandbox Code Playgroud)

我想使用DATEADD是正确的方法,但想知道为什么?

sql-server t-sql sql-server-2014

13
推荐指数
2
解决办法
2452
查看次数

SQL Server / T-SQL 是否支持换行以拆分长字符串?

有时我有一个 SQL 脚本,其中包含一个或多个超长(有时甚至是愚蠢的)字符串。通常这些是VARBINARY代表文件/程序集的文字/常量,但有时它们是文本。

真正长字符串的主要问题是一些文本编辑器不能很好地处理它们。例如,我VARBINARYCREATE ASSEMBLY [AssemblyName] FROM 0x....语句中使用了一个文字,而程序集本身的大小刚好超过 1 MB,相当于文本文件中的字符超过 200 万个,因为每个字节需要两个字符以十六进制表示法表示(例如0x1F= a1和 an F)。SQL Server Management Studio (SSMS) 不能很好地处理这个问题,并在我尝试滚动该行时挂起几秒钟。事实上,某些版本(不确定这是否仍然发生)甚至会在打开至少有一行超过特定长度的脚本时显示关于长行的警告。

第二个问题是,在没有启用自动换行的编辑器中使用或在线发布时,它会使格式复杂化。这里的问题是水平滚动条的滑块非常窄,即使稍微移动它,通常也会将非超长文本滚动到视野之外。

现在,T-SQL 不会用换行符甚至分号终止命令(尽管从 SQL Server 2005 开始,分号是首选/推荐的)。因此,由于 SQL Server 知道如何解析每个语句,从而知道它何时结束,似乎将长行拆分为多行,仅由newline/ carriage-return+分隔line-feed,这似乎并不合理。但这在任何一种情况下都不起作用。

PRINT 'Line1
Line2';
Run Code Online (Sandbox Code Playgroud)

返回(在“消息”选项卡中):

Line1
Line2
Run Code Online (Sandbox Code Playgroud)

这很有意义,因为换行符在文字/常量内。但是对 a 执行此操作VARBINARY也不起作用。

PRINT 0x1234
5678;
Run Code Online (Sandbox Code Playgroud)

给我一个错误。

sql-server ssms scripting t-sql

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

在线页面恢复达到 1000 个限制

我的任务是尝试恢复遭受损坏的数据库(由于 I/O 故障,此后已修复)。我不熟悉数据库或它包含的内容。

我得到了一个旧的(约 3 周)完整备份和一系列事务日志……但是缺少事务日志,所以我只能恢复到某个日期。大约有 2.5 周的数据丢失(并且有大量数据不断添加到此数据库中)。

我还获得了损坏数据库的副本(可以访问,但有很多页面损坏/丢失)。

我已经尝试了典型的DBCC CHECKDB命令(仍然没有repair_allow_data_loss,如果没有其他方法,那将是我的最后手段)。

在多次访问数据库之后(db 是一个 1.5 TB 的小怪物,我所做的一切都很慢并且需要一段时间),我尝试从上次已知的良好备份中对损坏的页面进行在线页面还原。

为此,我编写了一个脚本,该脚本RESTORE DATABASE <foo> PAGE='pages' FROM DISK='<bar.bak>'DBCC CHECKDB输出中创建了许多命令(基本上是一个正则表达式和一个不同的命令)......到目前为止一切顺利,它说我已经达到了 1000 页的限制每个文件(此数据库上有 8 个文件)每个还原命令。

所以它要求我“完成在线恢复”,但我不知道如何做到这一点......我没有尾日志或任何比我开始的完整备份更完整的东西,所以我基本上不知道如何完成恢复以继续尝试其余页面。

我试过一个,RESTORE DATABASE <foo> WITH RECOVERY但也没有用,它要求我提供一个我没有的日志。

有没有人对我如何尝试从这里恢复任何东西有任何提示?或者如何“完成”在线恢复以便我可以继续尝试恢复更多页面?如果我尝试离线还原,我会遇到同样的问题(基本上是添加WITH NORECOVERY到所有内容,然后尝试在最后将其恢复?)

手动处理数据库基本上是可以撤消的……有数百个表有数百万行,并且没有明确的含义。SELECT在几百万行之后,损坏的数据库将在查询中失败,但我不确定我能找出哪里。我试过重建所有非聚集索引,但有行数据损坏的页面,所以这也不起作用。

一些数据丢失是可以接受的,但至少应该尝试实现数据库的一致性。

损坏的数据库仍然在线并且客户端正在处理它(因此它不断获取新数据),因此我在实验室工作台上所做的任何过程都应该在之后在生产数据库上重现(停机对它来说很难)。

这是 SQL Server 2014 企业版

PS:我不是DBA...我是程序员,但是客户尝试了一些“专家”的sql灾难恢复服务,他们已经放弃了,所以我被要求看一下,看看我是否可以做任何事情。


更新:经过多次测试,逐页恢复是行不通的,所以我们放弃了这个想法。我们将进行手动恢复(从损坏的表中手动选择丢失的记录并将它们插入到上次已知的良好备份中),为其做一些自动化工具(同样,有成百上千的表)。

sql-server t-sql recovery restore sql-server-2014

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

隐藏 T-SQL 的选择输出

我正在尝试获取查询执行时间,但我也想隐藏查询输出。我只想要经过的时间 - 没有输出。

例子

DECLARE @Start datetime
DECLARE @End datetime

SELECT @StartTimeWA=GETDATE() 

SELECT 
       [id] 
      ,[database_id]
      ,[proc_name]
      ,[exec_t] from
  [DB].[dbo].[STAT] 

SELECT @End=GETDATE()

SELECT DATEDIFF(MS,@Start,@End) AS [Duration]
Run Code Online (Sandbox Code Playgroud)

目前,我得到了查询输出底部是我的持续时间,就输出而言,这是我唯一想要的。我一直无法做到这一点,想知道是否还有其他人遇到过类似的问题?这是我想在 T-SQL 中做的事情,而不是 Management Studio 或类似的东西。

我正在尝试监视运行 select 语句并向服务器报告所需的时间。我有一个外部监视器服务器,它将每分钟运行一次并获取时间(花费的持续时间),我将随着时间的推移使用它来趋势/基线。当当前查询吐出选择结果和我的持续时间时,它会扭曲它,并且我的监视器服务器变得混乱。我只想要持续时间列。我还将为插入执行此操作,这将很简单,因为它不需要执行选择。

我试图纯粹在 T-SQL 中做到这一点。我不想使用 DMV,因为我想在运行查询时获得所需的时间(快照),并检查当服务器经历不同级别的负载时这是否会随着时间的推移而改变,因为这会给我一个好主意关于查询执行时间是否发生变化。

sql-server t-sql

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

为测试数据生成大字符串

最近,我试图创建一个包含通用测试数据对于一些大型的串这里的一个问题。似乎我曾经知道一种乘法字符串的方法。但是,我已经记不起语法了。

我正在寻找类似的东西:

SELECT 'A' + ('a' * 1000) + 'ha!'
Run Code Online (Sandbox Code Playgroud)

想出“Aaaaaaaaaaaaaaha!” (嗯,当然要长得多。)

这在 T-SQL 中可能吗?(或者我在想其他语言吗?)另外,还有其他技术可以生成大字符串吗?

sql-server t-sql

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

在 RAISERROR 中使用 FLOAT

我正在使用RAISERROR()提供一些基本的单元测试功能(如这里),但我对无法FLOATs在错误消息中使用感到沮丧。我知道我可以将浮点数转换为字符串,但我RAISERROR在每个单元测试中都使用,我不想为每个测试添加另一行代码。(我的单元测试已经够啰嗦了!)有没有办法在参数列表中执行内联强制转换/转换RAISERROR?或者有其他方法可以解决这个缺陷吗?

更新: 所以最终我希望我能做的是:

RAISERROR('Unit Test FAILED! %f', 11, 0, @floatParm)
Run Code Online (Sandbox Code Playgroud)

不幸的是,RAISERROR一般不处理 %f 或浮点数。所以我必须这样做:

DECLARE @str VARCHAR(40) = CAST(@floatParm AS VARCHAR(40))
RAISERROR('Unit Test FAILED! %s', 11, 0, @str)
Run Code Online (Sandbox Code Playgroud)

...当它分散在数十个单元测试中时,它看起来就像一团糟。所以我想把它归结为这样的:

RAISERROR('Unit Test FAILED! %s', 11, 0, CAST(@floatParm AS VARCHAR(40))
Run Code Online (Sandbox Code Playgroud)

但这给了我一个Incorrect syntax near 'CAST'信息。我不明白为什么这是非法的,但确实如此。我可以在这里使用另一个“一个班轮”吗?

sql-server t-sql

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

SQL Server 如何将信息存储在作业计划属性中?

我知道有SELECT * FROM msdb..sysjobschedules,但这只是显示下一次计划运行的作业。

我想知道这是如何确定和存储的。那么它在哪里存储 Recurs every Monday 复选框的值呢?

sql-server t-sql jobs

12
推荐指数
2
解决办法
3484
查看次数