标签: t-sql

SQL Server 是否支持 GREATEST 和 LEAST,如果不支持,常见的解决方法是什么?

回顾这个问题,似乎不需要做很多工作。他们试图用日期扩展范围。在其他数据库中,您只需使用greatestleast..

least(extendDate,min), greatest(extendDate,max)
Run Code Online (Sandbox Code Playgroud)

当我尝试使用这些时,我得到

'least' is not a recognized built-in function name.
'greatest' is not a recognized built-in function name.
Run Code Online (Sandbox Code Playgroud)

这将涵盖任一方向的扩展。

就问题而言,您仍然需要进行排他性范围替换。

我只是想知道 SQL Server 用户如何实现查询模式来模仿leastgreatest功能。

您是否将条件展开到CASE语句中,或者是否存在启用此功能的 Microsoft 的扩展、第三方加载项或许可?

sql-server feature-comparison t-sql

30
推荐指数
6
解决办法
5万
查看次数

如果为正,则对所有项目求和。如果为负,则返回每一个

我需要找到一种方法来获取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)
Run Code Online (Sandbox Code Playgroud)

这是我想要的输出(每个 salesid 的正数SUM()和负数得到单独的一行返回):

salesid    num
1          26.32
1          -13.00
2          47.35
3          -12.32
3          -43.23
3          -2.32
Run Code Online (Sandbox Code Playgroud)

sql-server-2008 sql-server t-sql

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

子查询的别名与主查询的别名相同

我有一个 SQL 查询,其别名与其子查询的某些别名相同。

例如:

select *
from ROOM r
where ...
         (
              select *
              from ROAD r
              where ...
         )
Run Code Online (Sandbox Code Playgroud)

这很好用,因为子查询的别名似乎隐藏了主要的。

  1. 它会在所有情况下都这样工作吗?
  2. 我会得到未定义的结果吗?
  3. 如果可以这样做,我如何引用主查询的r

sql-server t-sql subquery alias

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

试图找出值最后一次改变的时间

我有一个表,其中有一个 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')
Run Code Online (Sandbox Code Playgroud)

结果应该是:

Taco_ID      Taco_date
1            2012-07-01 00:00:05
Run Code Online (Sandbox Code Playgroud)

(因为 00:05 是最后一次Taco_Value更改。)

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

26
推荐指数
4
解决办法
4万
查看次数

ON 与 WHERE 上的索引性能

我有两张桌子

@T1 TABLE
(
    Id INT,
    Date DATETIME
)

@T2 TABLE
(
    Id INT,
    Date DATETIME
)
Run Code Online (Sandbox Code Playgroud)

这些表在 (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()
Run Code Online (Sandbox Code Playgroud)

这也可以写成

SELECT *
FROM T1 AS t1
INNER JOIN T2 AS t2
ON 
    t1.Id = t2.Id
    AND
    t1.Date <= GETDATE()
    AND
    t2.Date <= GETDATE()
Run Code Online (Sandbox Code Playgroud)

我的问题是,这两个查询中哪一个提供了更好的性能,为什么?或者他们是平等的?

index join sql-server t-sql table

26
推荐指数
3
解决办法
3150
查看次数

为什么`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
Run Code Online (Sandbox Code Playgroud)

对 的调用connection.Query<int>(sql, ...)正在引发无效的强制转换异常。我已经调试了它,它是在 Dapper 调用GetValue返回的SqlDataReader.

的返回类型GetValueObject,在调试器中检查它显示它是一个装箱十进制。

如果我将选择更改为SELECT CAST(@@IDENTITY as int),则 GetValue 的返回是一个装箱的 int 并且不会引发异常。

Id 列绝对是 int 类型;为什么会SELECT @@IDENTITY返回一个小数?

一些附加信息:

  • 数据库是全新的。
  • 客户表是我添加到其中的唯一对象。数据库中没有其他(用户)表、视图、触发器或存储过程。
  • 数据库中有 10 行,Id 为 1,2,3,4,5,6,7,8,9,10(即该列不超出 int …

sql-server ado.net t-sql

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

将结果限制在前 2 个排名行

在SQL Server 2008中,我使用RANK() OVER (PARTITION BY Col2 ORDER BY Col3 DESC)与返回的数据集RANK。但是我每个分区有数百条记录,所以我将从等级 1、2、3......999 中获取值。但我只想RANKs在每个PARTITION.

例子:

ID   Name    Score    Subject
1    Joe      100      Math
2    Jim      99       Math
3    Tim      98       Math
4    Joe      99       History
5    Jim      100      History
6    Tim      89       History
7    Joe      80       Geography
8    Tim      100      Geography
9    Jim      99       Geography
Run Code Online (Sandbox Code Playgroud)

我希望结果是:

SELECT Subject, Name, RANK() OVER (PARTITION BY Subject ORDER BY Score DESC)
FROM Table
Run Code Online (Sandbox Code Playgroud)
Subject        Name      Rank …
Run Code Online (Sandbox Code Playgroud)

sql-server-2008 sql-server t-sql window-functions rank

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

SQL Server 中的“No Join Predicate”究竟是什么意思?

MSDN“缺少连接谓词事件类”表示“表示正在执行没有连接谓词的查询”。

但不幸的是,这似乎并不那么容易。

例如,非常简单的情况:

create table #temp1(i int);
create table #temp2(i int);
Select * from #temp1, #temp2 option (recompile);
Run Code Online (Sandbox Code Playgroud)

表中没有数据,也没有警告,尽管它显然没有连接谓词。

如果我查看 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 (i) values (1)
Run Code Online (Sandbox Code Playgroud)

我得到:

-- no warning:
Select * from #temp1 t1 
    inner join #temp2 t2 on t1.i = t2.i 
option (recompile)
-- has warning:
Select * from …
Run Code Online (Sandbox Code Playgroud)

sql-server-2005 sql-server-2008 t-sql

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

为什么 0 等于空字符串?

我需要一些帮助来找出以下T-SQL语句返回的原因1(true):

SELECT IIF( 0 = '', 1, 0)
Run Code Online (Sandbox Code Playgroud)

我猜有人改变了一个ANSI选项,比如SET ANSI_NULLS导致这种行为的其他东西。

我的问题是我加入了一些值,在最后一行集中我有由0''值连接的值,这是不正确的。

sql-server t-sql sql-server-2012

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

使用 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 =1

 ELSE RETURN @Palindrome =0

END
Run Code Online (Sandbox Code Playgroud)

我认为我在正确的轨道上,但我还有很长的路要走。有任何想法吗?

sql-server t-sql sql-server-2012 functions

24
推荐指数
8
解决办法
7790
查看次数