Questions tagged «t-sql»

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

2
为什么GROUP BY语句中的通配符不起作用?
我正在尝试使以下SQL语句正常工作,但出现语法错误: SELECT A.*, COUNT(B.foo) FROM TABLE1 A LEFT JOIN TABLE2 B ON A.PKey = B.FKey GROUP BY A.* 在这里,A是一个有40列的宽表,如果可能的话,我想避免在GROUP BY子句中列出每个列的名称。我有很多这样的表,必须在这些表上运行类似的查询,因此我必须编写一个存储过程。解决此问题的最佳方法是什么? 我正在使用MS SQL Server 2008。

3
SELECT语句中的OPTION FAST有什么作用?
我对OPTION (FAST XXX)查询提示在SELECT语句中的作用做了一些挖掘,但仍然对此感到困惑。根据MSDN: 指定优化查询以快速检索第一个number_rows。这是一个非负整数。返回第一个number_rows之后,查询将继续执行并产生其完整结果集。 对我来说,这没有多大意义,但基本上查询可以快速获得前XXX行,然后以正常速度获得其余行? 使我对此产生思考的Microsoft Dynamics查询是: select pjproj.project,pjproj.project_desc,pjproj.customer,pjproj.cpnyid from pjproj WITH (NOLOCK) where project like '%' order by project OPTION(FAST 500) 谁能确切解释这个查询提示在做什么,这是不使用它的好处?

2
如果为正,则对所有项目求和。如果为负,则返回每个
我需要找到SUM()所有正值的方法,num并返回SUM()所有正数的值,并为每个负数返回单独的一行。下面是一个示例DDL: Create Table #Be ( id int , salesid int , num decimal(16,4) ) Insert Into #BE Values (1, 1, 12.32), (2, 1, -13.00), (3, 1, 14.00) , (4, 2, 12.12), (5, 2, 14.00), (6, 2, 21.23) , (7, 3, -12.32), (8,3, -43.23), (9, 3, -2.32) 这是我想要的输出(每个salesid SUM()和负数的正数返回单独的行): salesid num …

2
如何在多行且不带逗号的情况下使用COALESCE?
我正在努力实现以下目标: California | Los Angeles, San Francisco, Sacramento Florida | Jacksonville, Miami 不幸的是,我正在“洛杉矶,旧金山,萨克拉曼多,杰克逊维尔,迈阿密” 我可以使用STUFF函数获得所需的结果,但是想知道是否有使用COALESCE的更干净的方法? STATE | CITY California | San Francisco California | Los Angeles California | Sacramento Florida | Miami Florida | Jacksonville DECLARE @col NVARCHAR(MAX); SELECT @col= COALESCE(@col, '') + ',' + city FROM tbl where city = …
27 sql-server  t-sql 

6
ON与WHERE的索引表现
我有两张桌子 @T1 TABLE ( Id INT, Date DATETIME ) @T2 TABLE ( Id INT, Date DATETIME ) 这些表在(Id,Date)上具有非聚集索引 我加入这些表 SELECT * FROM T1 AS t1 INNER JOIN T2 AS t2 ON t1.Id = t2.Id WHERE t1.Date <= GETDATE() AND t2.Date <= GETDATE() 这也可以写成 SELECT * FROM T1 AS t1 INNER …

7
尝试查找值最后一次更改的时间
我有一个具有ID,值和日期的表。该表中有许多ID,值和日期。 记录会定期插入此表中。ID将始终保持不变,但有时值会更改。 如何编写一个查询,该查询将为我提供ID以及最近一次更改值的时间?注意:该值将始终增加。 从此样本数据中: Create Table Taco ( Taco_ID int, Taco_value int, Taco_date datetime) Insert INTO Taco Values (1, 1, '2012-07-01 00:00:01'), (1, 1, '2012-07-01 00:00:02'), (1, 1, '2012-07-01 00:00:03'), (1, 1, '2012-07-01 00:00:04'), (1, 2, '2012-07-01 00:00:05'), (1, 2, '2012-07-01 00:00:06'), (1, 2, '2012-07-01 00:00:07'), (1, 2, '2012-07-01 00:00:08') …

9
使用T-SQL测试字符串是否是回文
我是T-SQL的初学者。我想确定输入字符串是否是回文,如果不是,则输出= 0,如果是,则输出= 1。我仍然在弄清楚语法。我什至没有收到错误消息。我正在寻找不同的解决方案和一些反馈,以更好地理解和了解T-SQL的工作原理,并且变得更好-我仍然是一名学生。 正如我所看到的,关键思想是将最左边和最右边的字符相互比较,检查是否相等,然后将左边的第二个字符与最后一个的第二个字符进行比较,依此类推。我们做一个循环:如果字符彼此相等,我们继续。如果到达末尾,则输出1;否则,输出0。 您能否批评一下: CREATE function Palindrome( @String Char , @StringLength Int , @n Int , @Palindrome BIN , @StringLeftLength Int ) RETURNS Binary AS BEGIN SET @ n=1 SET @StringLength= Len(String) WHILE @StringLength - @n >1 IF Left(String,@n)=Right(String, @StringLength) SET @n =n+1 SET @StringLength =StringLength -1 RETURN @Binary …

3
为什么“ SELECT @@ IDENTITY”返回一个小数?
我正在使用Dapper从ASP.NET MVC 3(.NET 4.0)应用程序对SQL Server 2008 R2 Express实例执行以下查询。 INSERT INTO Customers ( Type, Name, Address, ContactName, ContactNumber, ContactEmail, Supplier) VALUES ( @Type, @Name, @Address, @ContactName, @ContactNumber, @ContactEmail, @Supplier) SELECT @@IDENTITY 的调用connection.Query<int>(sql, ...)引发了无效的强制转换异常。我已经调试了它,就在Dapper调用return GetValue的时候SqlDataReader。 返回类型GetValue为Object,在调试器中检查它的显示类型是装箱的十进制数。 如果将select更改为SELECT CAST(@@IDENTITY as int),则GetValue的返回是装箱的int,并且不会引发异常。 Id列绝对是int类型;为什么要SELECT @@IDENTITY返回小数? 一些其他信息: 该数据库是全新的。 客户表是我添加到其中的唯一对象。数据库中没有其他(用户)表,视图,触发器或存储过程。 数据库中有10行,Id为1,2,3,4,5,6,7,8,9,10(即,该列未超出int的限制)。 我的表定义是 CREATE TABLE [dbo].[Customers]( [Id] [int] …

1
语言和DATEFORMAT安全哪些日期/时间文字格式?
很容易证明,由于SET LANGUAGE,SET DATEFORMAT或登录名的默认语言,除了以下两种格式外,许多其他日期/时间格式都容易引起误解: yyyyMMdd -- unseparated, date only yyyy-MM-ddThh:mm:ss.fff -- date dash separated, date/time separated by T 即使没有T的这种格式,也可能看起来像是有效的ISO 8601格式,但是它在几种语言中均失败: DECLARE @d varchar(32) = '2017-03-13 23:22:21.020'; SET LANGUAGE Deutsch; SELECT CONVERT(datetime, @d); SET LANGUAGE Français; SELECT CONVERT(datetime, @d); 结果: Die Spracheneinstellung wurde auf Deutschgeändert。 消息242,第16级,状态3国家 地图上的Eines varchar-Datentyps,日期从WereaußerhalbdesgültigenBereichs开始。 法语的最佳语言翻译。 消息242,级别16,状态3 转换日期类型为dénéesvalchar hors …

4
如果数据库只有一个插入,那么索引每个可能的列组合是否不好?
我正在一个需要大量选择查询的报表系统上工作,但是该报表系统基于仅填充一次的数据库。数据库管理系统是Microsoft SQL Server2017。可能有更好的方法来设计这样的系统,但让我们从理论上解决这个问题。 从理论上讲: 如果我们有一个非常大的数据库(几张表上有1.5亿行) 我们可以假设数据库只会被填充一次。 索引每个可能的列组合是否会对选择查询产生负面的性能影响?

1
在SQL Server中“无联接谓词”到底是什么意思?
MSDN“ 缺少连接谓词事件类 ”说“ 表明正在执行的查询没有连接谓词 ”。 但是不幸的是,这似乎并不那么容易。 例如,非常简单的情况: create table #temp1(i int); create table #temp2(i int); Select * from #temp1, #temp2 option (recompile); 表中没有数据,也没有警告,尽管它显然没有连接谓词。 如果我看一下SQL Server 2005的文档(相同的链接,只是其他服务器版本),则会有额外的一句话:“ 仅当连接的两面都返回多行时,才会产生此事件。 ”在以前的情况下具有完美的感觉。没有数据,因此双方都返回0行且没有警告。插入行,得到警告。嗯不错。 但是对于下一个令人困惑的情况,我在两个表中插入了相同的值: Insert into #temp1 (i) values (1) Insert into #temp1 (i) values (1) Insert into #temp2 (i) values (1) Insert into #temp2 …

1
如何将SQL Server Unicode / NVARCHAR字符串设置为表情符号或补充字符?
我想根据其Unicode代码点将Unicode字符串变量设置为特定字符。 我想使用65535以上的代码点,但是SQL Server 2008 R2数据库的排序规则为SQL_Latin1_General_CP1_CI_AS。 根据Microsoft的NCHAR文档,该NCHAR函数采用一个整数,如下所示: integer_expression 当数据库的排序规则不包含补充字符(SC)标志时,这是一个从0到65535(0到0xFFFF)的正整数。如果指定的值超出此范围,则返回NULL。有关补充字符的更多信息,请参见排序规则和Unicode支持。 当数据库的排序规则支持补充字符(SC)标志时,这是一个从0到1114111(从0到0x10FFFF)的正整数。如果指定的值超出此范围,则返回NULL。 所以这段代码: SELECT NCHAR(128512); NULL在此数据库中返回。 我希望它返回与此相同的内容: SELECT N'😀'; 在排序规则“不包含补充字符(SC)标志”的数据库中,如何使用代码(不使用实际的表情符号字符)将Unicode字符串变量(例如nvarchar)设置为表情符号? 表情符号Unicode代码点的完整列表 (最终,我希望任何角色都能正常工作。为了方便参考,我只是选择了表情符号。) (尽管服务器是SQL Server 2008 R2,但我也对以后版本的任何解决方案感到好奇。) 假设没有办法,是否可以在另一个具有适当排序规则的数据库中引用内联用户定义函数? 如何找到带有“ supplementary character”标志的排序规则? 这不会在我们的服务器上返回任何记录: SELECT * FROM sys.fn_helpcollations() WHERE name LIKE 'SQL%[_]SC'; 似乎引入了SQL Server 2012 Latin1_General_100_CI_AS_SC可以正常工作。您可以在较旧的实例上安装排序规则吗? 整理参考: 在SQL Server中,char,nchar,varchar和nvarchar有什么区别? Microsoft的补充字符归类信息 Microsoft的SQL Server 2008 R2排序规则列表 是否有解释说明为什么SQL Server不管排序规则如何都可以理解和处理扩展字符(除了从角度来看之外)NCHAR?

1
为什么0等于空字符串?
我需要一些帮助来查找为什么以下T-SQL语句返回1(true): SELECT IIF( 0 = '', 1, 0) 我猜有人更改了ANSI选项SET ANSI_NULLS或其他导致行为的选项。 我的问题是我要加入一些值,而在最后一行中,我有由0和''值相连的值,这是不正确的。

2
子查询的别名与主查询的别名相同
我有一个别名与其子查询别名相同的SQL查询。 例如: select * from ROOM r where ... ( select * from ROAD r where ... ) 这很好用,因为子查询的别名似乎隐藏了主查询的别名。 在所有情况下都可以那样工作吗? 我会得到不确定的结果吗? 如果可以的话,如何引用主查询r呢?

2
ON子句的位置实际上意味着什么?
普通JOIN ... ON ...语法是众所周知的。但是也可以将ON子句JOIN与其对应的子句分开放置。这是在实践中很少见到的东西,在教程中找不到,而且我还没有找到任何 Web资源甚至提到这是可能的。 这是一个可以使用的脚本: SELECT * INTO #widgets1 FROM (VALUES (1), (2), (3)) x(WidgetID) SELECT * INTO #widgets2 FROM (VALUES (1, 'SomeValue1'), (2, 'SomeValue2'), (3, 'SomeValue3')) x(WidgetID, SomeValue) SELECT * INTO #widgetProperties FROM (VALUES (1, 'a'), (1, 'b'), (2, 'a'), (2, 'b')) x(WidgetID, PropertyName) --q1 SELECT w1.WidgetID, w2.SomeValue, …
23 sql-server  t-sql 

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.