Questions tagged «t-sql»

Transact-SQL(T-SQL)是Microsoft SQL Server和SAP的Sybase使用的SQL的方言。


3
通过代码创建新函数(如果不存在)
我想通过脚本在数据库中创建新功能。脚本代码如下: IF Exists(Select * From sys.sysobjects A Where A.name =N'fn_myfunc' and xtype=N'FN') return; CREATE FUNCTION fn_myfunc () returns varchar(10) AS Begin ... End 但是当我执行上述脚本时,SQL Server返回错误: 'CREATE FUNCTION' must be the first statement in a query batch.

2
为什么“ SELECT POWER(10.0,38.0);”会引发算术溢出错误?
我正在更新我的IDENTITY溢出检查脚本以解决DECIMAL和NUMERIC IDENTITY列。 作为检查的一部分,我计算了每一IDENTITY列的数据类型范围的大小。我用它来计算该范围已用尽的百分比。对于DECIMAL与NUMERIC 该范围的大小2 * 10^p - 2,其中p是精度。 我用DECIMALand NUMERIC IDENTITY列创建了一堆测试表,并尝试如下计算它们的范围: SELECT POWER(10.0, precision) FROM sys.columns WHERE is_identity = 1 AND type_is_decimal_or_numeric ; 这引发了以下错误: Msg 8115, Level 16, State 6, Line 1 Arithmetic overflow error converting float to data type numeric. 我将其范围缩小到IDENTITY类型的列DECIMAL(38, 0)(即,具有最大精度),因此我POWER()直接尝试对该值进行计算。 以下所有查询 SELECT POWER(10.0, 38.0); SELECT CONVERT(FLOAT, (POWER(10.0, …

2
SQL Server十进制(9,0)与INT
我们的一位客户使用DECIMAL(18,0)他的SQL Server 2008R2数据库中的数据类型作为某些列。由于列的增长非常缓慢,因此他最近提议更改数据类型DECIMAL(5,0)以重新获得一些存储空间。 根据MSDN库,与DECIMAL(5,0)数据类型一样,DECIMAL(9,0)数据类型的存储空间为5个字节。INT是小1个字节,但可以存储-2 ^ 31到2 ^ 31范围内的所有内容,而不是DECIMAL(5,0)可以存储的-99,999到99,999 。即使是最大的DECIMAL5个字节(DECIMAL(9,0)),也只能存储-999,999,999到999,999,999(小于范围的一半)范围内的整数INT 4字节)。 我可以想到使用DECIMALover 的两个“好处” INT: 之后可以增加规模,而无需使用更多的存储空间 可以将精度扩展到38位,而无需更改数据类型 但是我认为这些并不是真正的好处: 将比例添加到整数仅在极少数情况下才有意义(在大多数情况下比例确实有所不同,也可以预先添加) SQL Server将每个精度/小数位组合视为不同的数据类型,因此在提高精度或小数位时,不会单独保留数据类型。 这让我想知道:DECIMAL(5,0)整数数据类型的附加好处是什么?

5
在手写代码中使用SQL Server的括号表示法有意义吗?
当代码生成器使用[]几乎所有内容的新Microsoft括号符号()生成输出时,它们通常会更简单。 当我第一次看到它时,我虽然赞叹了一些被禁止的引用标识符符号的转世。 据我所知,它是Microsoft的专有扩展(意味着Oracle不支持它)。 查看SQL Server,如果您定义如下表,则没有区别 CREATE TABLE [dbo].[Table_2] ([col1] [int], [col2] [int]); 要么 CREATE TABLE dbo.Table_2 (col1 int, col2 int); 这是个人或公司风格的问题。始终如一。 现在,如果您要将数据库迁移到Oracle,则没有选择。 您可以使用旧的带引号的标识符,但是它们区分大小写,这会造成很多麻烦。 从生成的代码中删除所有括号,避免使用空格,其他特殊字符和名称的保留关键字以及仅以大多数DBMS能够理解的方式进行编码,这是一个好主意吗?

1
在SQL Server中本地解码Base64字符串
我varchar在SQL Server的表中有一列,其中包含一个base64编码的文本字符串,我想将其解码为等效的纯文本 SQL Server是否有任何本机功能来处理此类事件? 一个示例base64字符串: cm9sZToxIHByb2R1Y2VyOjEyIHRpbWVzdGFtcDoxNDY4NjQwMjIyNTcxMDAwIGxhdGxuZ3tsYXRpdHVkZV9lNzo0MTY5ODkzOTQgbG9uZ2l0dWRlX2U3Oi03Mzg5NjYyMTB9IHJhZGl1czoxOTc2NA== 解码为: role:1 producer:12 timestamp:1468640222571000 latlng{latitude_e7:416989394 longitude_e7:-738966210} radius:19764

1
为什么使用CASE,多个COUNT比一个SUM快?
我想知道以下两种方法中哪一种速度更快: 1)三COUNT: SELECT Approved = (SELECT COUNT(*) FROM dbo.Claims d WHERE d.Status = 'Approved'), Valid = (SELECT COUNT(*) FROM dbo.Claims d WHERE d.Status = 'Valid'), Reject = (SELECT COUNT(*) FROM dbo.Claims d WHERE d.Status = 'Reject') 2)SUM与FROM-clause: SELECT Approved = SUM(CASE WHEN Status = 'Approved' THEN 1 ELSE 0 END), …


4
连接在运行时是否优化到where子句?
当我写这样的查询... select * from table1 t1 join table2 t2 on t1.id = t2.id SQL优化器不确定将其翻译为...吗? select * from table1 t1, table2 t2 where t1.id = t2.id 从本质上讲,SQL Server中的Join语句只是编写sql的一种简便方法吗?还是在运行时实际使用? 编辑:我几乎总是并且几乎总是会使用Join语法。我很好奇发生了什么。

1
强制索引假脱机
我知道出于性能原因应避免使用它,但是我正在尝试展示一种情况,以使其演示如何确保不出现。 但是,我最后遇到了索引丢失警告,但是优化器选择不创建临时索引。 我正在使用的查询是 SELECT z.a FROM dbo.t5 AS z WITH(INDEX(0)) WHERE EXISTS ( SELECT y.a FROM dbo.t4 AS y WHERE y.a = z.a ) OPTION (MAXDOP 1); 表模式为: CREATE TABLE dbo.t4 ( a integer NULL, b varchar(1000) NULL, p varchar(100) NULL ); CREATE TABLE dbo.t5 ( a integer NULL, b …

2
在CREATE VIEW中使用WITH进行SQL处理
我想使用WITH子句创建VIEW,但实际上找不到正确语法的任何引用。 我想要这样 WITH TempTbl AS (SELECT ...) CREATE VIEW SomeView SELECT * FROM TempTbl 使用几个WITH子句的正确语法是什么? 在MSDN上没有任何用处:(
14 t-sql  view 

2
为什么CTE应该以分号开头?
我只是在看StackOverflow上的一篇文章,其中Aaron Bertrand建议使用CTE代替数字表,这是一种执行手头任务的优雅方法。我的问题是,为什么CTE的第一行以分号开头? ;WITH n AS (SELECT TOP (10000) n FROM (SELECT n = ROW_NUMBER() OVER (ORDER BY s1.[object_id]) FROM sys.all_objects AS s1 CROSS JOIN sys.all_objects AS s2 ) AS x ORDER BY n ) SELECT n FROM n ORDER BY n; -- look ma, no gaps! 这是为了确保WITH语句不会被解析为先前的内容SELECT或其他内容?我在SQL Server 2005 BOL中看不到有关在WITH之前使用分号的任何信息。
14 sql-server  t-sql  cte  syntax 

2
在线页面恢复达到1000个限制
我的任务是尝试恢复遭受损坏的数据库(由于I / O故障,此问题已修复)。我不熟悉数据库或其包含的内容。 我得到了旧的(约3周)完整备份和一系列事务日志...但是缺少事务日志,因此我只能恢复到某个日期。大约有2.5周的数据丢失(并且不断有大量数据添加到该数据库中)。 我还收到了损坏的数据库的副本(可以访问,但是有很多页面损坏/丢失)。 我已经尝试了典型的DBCC CHECKDB命令(仍然没有repair_allow_data_loss,如果没有其他方法,那将是我的最后选择)。 在许多数据库进入数据库之后(数据库是一个1.5 TB的小怪物,我所做的一切都很缓慢并且需要一段时间),我尝试从上次已知的损坏页面备份中恢复联机页面。 为此,我已经完成了一个脚本,该脚本RESTORE DATABASE <foo> PAGE='pages' FROM DISK='<bar.bak>'从DBCC CHECKDB输出中创建了许多命令(基本上是一个正则表达式和一个单独的命令)...到目前为止,效果很好,可以说达到了1000页的限制每个还原命令每个文件(此db上有8个文件)。 因此,它要求我“完成在线还原”,但是我对如何做到这一点感到茫然。我基本上不知道如何完成还原以继续尝试其余页面。 我尝试了一个,RESTORE DATABASE <foo> WITH RECOVERY但是也没有用,它要求我提供我没有的日志。 有人对我如何从此处恢复任何内容有任何提示吗?还是如何“完成”在线还原,以便我可以继续尝试恢复更多页面?如果我尝试脱机还原(基本上添加WITH NORECOVERY到所有内容,然后尝试将其恢复到最后,是否会遇到相同的问题?) 手工计算数据库基本上是不可能的……有数百个表和数百万行,并且没有明确的含义。数SELECT百万行后,损坏的数据库将对查询失败,但是我不确定我可以算出哪里。我试过重建所有非聚集索引,但是有行数据损坏的页面,所以也行不通。 某些数据丢失是可以接受的,但至少应尝试实现数据库的一致性。 损坏的数据库仍处于联机状态,并且客户正在使用它(因此它将不断获取新数据),因此,我在实验室工作台上执行的任何过程都应可在生产数据库上重现(停机将非常困难)。 这是SQL Server 2014 Enterprise PS:我不是DBA ...我是一名程序员,但是客户端尝试了一些“专家” sql灾难恢复服务,但他们已经放弃了,所以我被要求研究一下,看看是否可以做任何事情。 更新:经过多次测试,逐页还原是不可行的,因此我们放弃了这个想法。我们将进行手动恢复(手动从损坏的表中选择丢失的记录,并将其插入到最后一个已知的良好备份中),为此做一些自动化的工具(同样,有成百上千的表)。

4
此WHERE子句中的%有何作用?
我正在训练中,其中一个脚本具有以下命令: SELECT SUM(Col2) FROM clust_table WHERE Col1 % 3 = 1 我想知道此代码段在WHERE子句中的作用: Col1 % 3 = 1 我在互联网上进行了一些研究,但没有找到有关此命令的参考。
13 sql-server  t-sql 

3
克服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 '?' 如果其中的查询LIKE超过4000个字符,那么即使我的查询在缓存计划中,我也会得到0个结果。(我期待至少是错误)。 有没有办法解决此问题或采取其他措施?我的查询长度可能超过了>个10000字符,看起来好像无法使用来查找它们LIKE。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.