标签: t-sql

在 CREATE VIEW 中使用 WITH 处理 SQL

我想使用 WITH 子句创建 VIEW,但真的找不到任何关于正确语法的参考。

我想要这样

WITH TempTbl AS (SELECT ...)
CREATE VIEW SomeView
SELECT *
FROM TempTbl
Run Code Online (Sandbox Code Playgroud)

使用多个 WITH 子句的正确语法是什么?

MSDN 上没有任何用处 :(

t-sql view

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

根据时间间隔对记录进行分组

我有一个具有以下架构的表,我需要定义一个查询,该查询可以根据时间间隔(例如每分钟记录)对数据进行分组,然后提供自上一组以来对 SnapShotValue 的更改总和。目前,SnapShotValue 总是递增,所以我只需要差异的总和。任何人都可以帮助使用可能执行此操作的 SQL Server T-SQL 查询吗?我愿意更改架构,但这是我目前拥有的。

架构

CaptureTime   (datetime)
SnapShotValue (int)
Run Code Online (Sandbox Code Playgroud)

样本数据

1 Jan 2012 00:00:00,   100
1 Jan 2012 00:00:30,   125
1 Jan 2012 00:01:00,   200
1 Jan 2012 00:01:30,   300
1 Jan 2012 00:02:15,   400
1 Jan 2012 00:02:30,   425
1 Jan 2012 00:02:59,   500
Run Code Online (Sandbox Code Playgroud)

所需查询结果

1 Jan 2012 00:01:00,   225 -- Sum of all captured data changes up to the 1 minute mark
1 Jan 2012 00:02:00,   500 -- Sum of all captured …
Run Code Online (Sandbox Code Playgroud)

sql-server-2008 query t-sql

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

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 范围内的整数(不到INT4 个字节提供的范围的一半)。

我可以想到使用DECIMALover的两个“好处” INT

  • 能够在不使用更多存储空间的情况下增加规模
  • 能够将精度扩展到 38 位,而无需更改数据类型

但在我看来,这些并不是真正的好处:

  • 向整数添加比例仅在极少数情况下才有意义(在大多数情况下,比例确实会产生影响,也可以预先添加)
  • SQL Server 将每个精度/小数位数组合视为不同的数据类型,因此在增加精度或小数位数时不会单独保留数据类型。

这让我想知道:DECIMAL(5,0)整数数据类型的额外好处是什么?

sql-server datatypes t-sql

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

SQL Server 2012 将 [括号] 放在表名和列名周围

当您将 Columns 文件夹拖到编辑器窗口时,将添加不带括号的完整列列表。如果您单独拖动列,则它们具有括号。

有没有办法把它关掉?我在选项中找不到任何东西,而且它们真的很让人分心。

sql-server ssms t-sql configuration sql-server-2012

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

如何让 Brent Ozar 的 sp_BlitzIndex 在 Azure 上运行?

我从 Brent Ozar 的网站下载了 SQL Server First Aid Kit。当我以Azure 数据库服务器级别管理员身份登录时,当我尝试通过 Microsoft Sql Server Management Studio 针对我的主数据库运行sp_BlitzIndex脚本时,出现以下错误:

消息 262,级别 14,状态 18,过程 sp_BlitzIndex,第 18 行 CREATE PROCEDURE 权限在数据库“master”中被拒绝。

我在要测试的数据库实例上成功创建了该过程。当我执行该程序时,我收到一条错误消息:

消息 50000,级别 16,状态 1,第 1265 行无效的对象名称“mydatabase.sys.partitions”。

接下来我尝试聪明一点,直接对master数据库运行存储过程代码,而不创建存储过程,得到以下错误:

此版本的 SQL Server 不支持消息 50000,级别 15,状态 1,第 1267 行引用“mydatabase.sys.indexes”中的数据库和/或服务器名称。

我没有足够的信心开始玩弄约 2700 行索引启发式逻辑的内部工作原理。是否有一种快速、简单的方法可以让这个存储过程在 Azure SQL 数据库上很好地工作,或者我应该在别处寻找索引分析工具/存储过程?

t-sql azure-sql-database azure-sql-database-v11 sp-blitzindex

14
推荐指数
1
解决办法
2029
查看次数

为什么多个 COUNT 比使用 CASE 的一个 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')
Run Code Online (Sandbox Code Playgroud)

2)SUM带 -FROM子句:

SELECT  Approved = SUM(CASE WHEN Status = 'Approved' THEN 1 ELSE 0 END),
        Valid    = SUM(CASE WHEN Status = 'Valid'    THEN 1 ELSE 0 END),
        Reject   = SUM(CASE WHEN Status = 'Reject'   THEN 1 ELSE …
Run Code Online (Sandbox Code Playgroud)

performance sql-server-2005 sql-server t-sql

14
推荐指数
1
解决办法
4298
查看次数

如何使用 COLUMNS_UPDATED 检查某些列是否已更新?

我有一个包含 42 列的表和一个触发器,当这些列中的 38 列更新时,它应该做一些事情。因此,如果其余 4 列发生更改,我需要跳过逻辑。

我可以使用UPDATE()函数并创建一个大IF条件,但更喜欢做一些更短的事情。使用COLUMNS_UPDATED我可以检查是否所有某些列都更新了?

例如,检查第 3、5 和 9 列是否更新:

  IF 
  (
    (SUBSTRING(COLUMNS_UPDATED(),1,1) & 20 = 20)
     AND 
    (SUBSTRING(COLUMNS_UPDATED(),2,1) & 1 = 1) 
  )
    PRINT 'Columns 3, 5 and 9 updated';
Run Code Online (Sandbox Code Playgroud)

在此处输入图片说明

因此,203和的5值,以及1列的值,9因为它设置在第二个字节的第一位。如果我将语句更改为OR它会检查列3和/5或列9是否更新?

如何OR在一个字节的上下文中应用逻辑?

trigger sql-server t-sql

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

如何使用 TSQL 动态更改数据库

我在尝试将 SSMS 的上下文动态更改为动态 SQL 中指定的数据库时遇到问题:

EXEC sys.sp_executesql N'USE db1 ' ;
Run Code Online (Sandbox Code Playgroud)

它成功执行,但 SSMS 的数据库上下文不会改变。

我试过对上面的稍作修改

DECLARE @sql NVARCHAR(100) DECLARE @db NVARCHAR(50)
SET @db = N'db1' SET @sql = N'Use ' + @db
EXEC sp_executesql @sql
Run Code Online (Sandbox Code Playgroud)

同样,它成功执行,但数据库没有改变。

sql-server dynamic-sql t-sql sql-server-2014

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

如何从字符串中去除非数字字符?

用户在一个框中输入一个搜索词,该值被传递到一个存储过程,并根据数据库中的几个不同字段进行检查。这些字段并不总是具有相同的数据类型。

一个字段(电话号码)由所有数字组成,因此在检查它时会使用 .Net CLR 函数从字符串中去除所有非数字字符。

SELECT dbo.RegexReplace('(123)123-4567', '[^0-9]', '')
Run Code Online (Sandbox Code Playgroud)

问题是,此功能有时会突然停止工作,并出现以下错误:

Msg 6533, Level 16, State 49, Line 2
AppDomain MyDBName.dbo[runtime].1575 被升级策略卸载,以确保 
应用程序的一致性。访问关键资源时发生内存不足。
System.Threading.ThreadAbortException:类型异常 
'System.Threading.ThreadAbortException' 被抛出。
System.Threading.ThreadAbortException: 

我已经尝试了MSDN 上针对此错误发布的建议,但仍然遇到问题。目前,切换到 64 位服务器不是我们的选择。

我知道重新启动服务器会释放它拥有的任何内存,但这在生产环境中不是一个可行的解决方案。

有没有办法仅使用 T-SQL 从 SQL Server 2005 中的字符串中去除非数字字符?

sql-server-2005 sql-server t-sql

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

如何检查空或空的表值参数?

我有一个存储过程 (SS2k8),其中包含一些有时为 null 或为空的表值参数。我已经看到这个StackOverflow 帖子说空/空 TVP 应该简单地从调用参数列表中省略。我的问题是我无法弄清楚如何在存储过程中检查空或空值,因为“IF (@tvp IS NULL)”在过程创建时失败,并显示消息“必须声明标量变量“@tvp””。我是否必须在 TVP 上执行 SELECT COUNT(*) 并检查零?

代码摘录:

CREATE PROCEDURE [foo] (@tvp [TvpType] READONLY) AS

IF (@tvp IS NOT NULL) -- doesn't work
BEGIN
  -- lots of expensive processing
END
ELSE
BEGIN
  -- a little bit of cheap processing
END
...
Run Code Online (Sandbox Code Playgroud)

sql-server-2008 null sql-server t-sql table-valued-parameters

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