标签: t-sql

SQL Server :: 该记录占用了多少 8K 页?

我想查看特定记录占用了多少 8K 页。

如果您在 AdventureWorks2019 上运行此查询:

SELECT ProductID
    ,Name
    ,DATALENGTH(Name) AS SizeInBytes
    ,LEN(Name) AS NumberOfCharacters
FROM Production.Product
ORDER BY 1
Run Code Online (Sandbox Code Playgroud)

您可以得到每条记录的咬合列表:

产品ID 姓名 大小(以字节为单位) 字符数
1 可调式竞赛 30 15
2 轴承球 24 12
3 BB 球轴承 30 15
4 耳机滚珠轴承 42 21
316 刀刃 10 5

如何添加包含该记录所用页数的列?

我当然可以,DATALENGTH(Name) / 8 AS PagesTaken但我想知道是否有一些命令可以让我通过SELECT.

sql-server data-pages t-sql database-size size

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

有没有办法删除插入的数据,反之亦然?

我正在尝试在同一查询中插入数据然后删除数据。

我试图将其分块删除,以免导致日志问题:

DECLARE @BatchSize INT
SET @BatchSize = 100000

WHILE @BatchSize <> 0
BEGIN 
   
DELETE (@BatchSize) TABLE1 
WHERE   LogType = 'LOGTYPE'
AND     TABLE1.Id NOT IN (SELECT Id FROM TABLE2)
AND     TABLE1.Id IN     (SELECT Id FROM DifferentDB..TABLE3)
    
   SET @BatchSize = @@rowcount 
END
Run Code Online (Sandbox Code Playgroud)

但同样的查询,我想先在辅助数据库中插入数据,然后删除。

是否可以在没有触发器的情况下实现?(插入、删除……)

我也愿意接受更好的分块删除方法,我只是凭记忆得到了这个方法。

sql-server t-sql sql-server-2014

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

如何在SQL Server的catch块中获取调用堆栈信息?

当我的查询中有多个错误,并且我在 catch 块中使用try catchand函数时,我只会收到最后一条错误消息。error_message()

例如,如果我的错误是:

Msg 2714, Level 16, State 5, Line 14
There is already an object named 'IX_EntityTypeConfigs' in the database.
Msg 1750, Level 16, State 1, Line 14
Could not create constraint or index. See previous errors.
Run Code Online (Sandbox Code Playgroud)

在 catch 块中我刚刚得到:

Could not create constraint or index. See previous errors.
Run Code Online (Sandbox Code Playgroud)

我怎样才能得到完整的消息?

我搜索了一下,发现这是 SQL Server 的限制,但文章属于 2014 年及之前的版本。

我想知道从那以后情况是否发生了变化。

sql-server t-sql

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

在 SQL Server 中将 SQL 文件嵌套到另一个文件中

我有一个简单的 SQL 文件,用于执行一些测试:

DECLARE @VAR1 AS VARCHAR(100) = '12345'
DECLARE @VAR2 AS INTEGER      = 54321

WAITFOR DELAY '00:00:02'

INSERT Orders SELECT @VAR1 AS COL1, @VAR2 AS COL2, ...
...
Run Code Online (Sandbox Code Playgroud)

在启动这一切之前,我想做一些清理工作:

/* Clean SpecialSubSubEntries */
DELETE SpecialSubSubEntries
  WHERE Id IN (SELECT Id FROM SubSubEntries
                 WHERE SubEntryId IN (SELECT Id FROM SubEntries
                                        WHERE EntryId IN (SELECT Id FROM Entries
                                                            WHERE Name='ENTRY01')
                                      )
               )

DELETE SubSubEntries
  WHERE SubEntryId IN (SELECT Id FROM SubEntries
                         WHERE EntryId IN (SELECT Id FROM Entries
                                             WHERE Name='ENTRY01')
                      ) …
Run Code Online (Sandbox Code Playgroud)

sql-server t-sql external-scripts

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

在 T-SQL 中计算值的中位数

我有一段用 T-SQL 编写的代码(存储过程),它将临时表中的多个数据插入表中,如下所示:

INSERT INTO [myschema].[CalculatedData](
    Year, 
    Month,
    Line,
    Car,
    Service,
    Route,
    Trip,
    Stop,
    Qty,
    CalculatedMean
  ) SELECT
    Year,
    Month,
    Line,
    Car,
    Service,
    Route,
    Trip,
    Stop,
    COUNT(*),
    AVG(Duration),  
  FROM
    @TableToCalculate
  GROUP BY
    Year,
    Month,
    Line,
    Car,
    Service,
    Route,
    Trip,
    Stop;
Run Code Online (Sandbox Code Playgroud)

如您所见,我计算了所有值的平均值。很简单,考虑到内置功能

现在,我想做的是计算中位数。没有任何函数可以计算它,但由于中位数等于计算第 50 个百分位数,因此可以使用它。但我不知道该怎么做。

有什么帮助吗?

sql-server t-sql sql-server-2016

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

sys.dm_exec_describe_first_result_set 返回错误的数据类型

我有两个与链接服务器连接的 SQL Server 2016。当我sys.dm_exec_describe_first_result_set从远程服务器查询时,它返回列表的数字数据类型而不是十进制。

第一个查询(从远程服务器执行)

select * from sys.dm_exec_describe_first_result_set (N'select top 1 * from LinkedServerFoo.DatabaseFoo.dbo.TargetTable', NULL, 0) [source]
Run Code Online (Sandbox Code Playgroud)

第二个查询(从sql server执行)

select * from sys.dm_exec_describe_first_result_set (N'select top 1 * from DatabaseFoo.dbo.TargetTable', NULL, 0) [source]
Run Code Online (Sandbox Code Playgroud)

结果

在此输入图像描述

这对我来说是一个问题,因为我根据这些查询的输出来比较数据类型。

知道可能出现什么问题吗?为什么会这样以及如何解决?

  • smalldatetimewhere sys 表错误返回也存在同样的问题datetime

t-sql system-tables sql-server-2016

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

将列添加到 SELECT 后,MIN 函数返回多行

我试图获得表中Price产品的最小值。DescriptionProductVariation

在此输入图像描述

以这种方式创建查询时:

SELECT productId, MIN([price]) AS price
FROM ProductVariation
GROUP BY ProductId
Run Code Online (Sandbox Code Playgroud)

它按预期工作,分组依据ProductId和最小值Price

产品编号 价格
3 299.99
6 299.99
7 299.99
8 199.99
9 299.99
10 299.99
11 159.99
12 159.99
13 189.99
14 189.99

但是,当我将Description列添加到SELECT

SELECT productId, [Description], MIN([price]) AS price
FROM ProductVariation
GROUP BY ProductId, [Description]
Run Code Online (Sandbox Code Playgroud)

它显示所有行,重复ProductId列。

产品编号 描述 价格
3 自然的 299.99
6 饼干和奶油 299.99
7 莫兰戈 299.99
8 包尼利亚 199.99
8 巧克力 …

t-sql

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

UPDATE 或 DELETE 语句的非目标表上是否忽略了WITH (NOLOCK) 提示?

在 SQL Server 数据库中,UPDATE 和 DELETE 语句中的目标表上的WITH (NOLOCK) 查询提示将被忽略。但是,这是否也适用于更新或删除连接中包含的表?例如,是:

update t
set value1 = 123
FROM mytable t
inner join othertable o with (nolock) on t.id = o.id
Run Code Online (Sandbox Code Playgroud)

相当于:

update t
set value1 = 123
FROM mytable t
inner join othertable o on t.id = o.id
Run Code Online (Sandbox Code Playgroud)

sql-server t-sql

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

鉴于 CREATE PROCEDURE 必须是其批处理的第一个语句,那么临时存储过程有什么用呢?

最近,我意识到临时存储过程,并为我在职业生涯中从未见过它们使用过而感到震惊。当我记得这CREATE PROCEDURE必须是其批次的第一个语句时,我感到非常失望,这肯定限制了它们的使用。当我看到他们在这个网站上很少被提及时,我支持了这个想法。他们甚至没有标签!

临时存储过程的惯用用例是什么?他们如何避免因需要成为批次中的第一个语句而造成的限制?

sql-server stored-procedures t-sql tempdb

3
推荐指数
2
解决办法
600
查看次数

获取当前日期作为存储过程的一部分

我有以下 SP:

SELECT
   moncallAdd.FirstListing,
   DATEADD(MINUTE, mOnCallAdd.StartOnCallTime,
         DATEADD(DAY, mOnCallAdd.StartOnCallDate, '12/31/1899')) AS OnCallStart,
   DATEADD(MINUTE, mOnCallAdd.duration,
         DATEADD(MINUTE, mOnCallAdd.StartOnCallTime,
                 DATEADD(DAY, mOnCallAdd.StartOnCallDate, '12/31/1899'))) AS OnCallEnd
FROM
 mdr.dbo.mOnCallAdd
 where DATEADD(DAY, mOnCallAdd.StartOnCallDate, '12/31/1899')= DATEADD(ms , 0 - DATEPART(ms , GETDATE()) ,
         DATEADD(s , 0 - DATEPART(s , GETDATE()) , GETDATE())) and
 mOnCallAdd.SchedName = 'arc im' 

UNION    
SELECT
 moncallDelete.FirstListing,
 DATEADD(MINUTE, mOnCallDelete.StartOnCallTime,
         DATEADD(DAY, mOnCallDelete.StartOnCallDate, '12/31/1899')) AS OnCallStart,
 DATEADD(MINUTE, mOnCallDelete.duration,
         DATEADD(MINUTE, mOnCallDelete.StartOnCallTime,
                 DATEADD(DAY, mOnCallDelete.StartOnCallDate, '12/31/1899'))) AS OnCallEnd
FROM
  mdr.dbo.mOnCallDelete
where DATEADD(DAY, mOnCallDelete.StartOnCallDate, '12/31/1899')= DATEADD(ms , 0 - DATEPART(ms , GETDATE()) …
Run Code Online (Sandbox Code Playgroud)

sql-server t-sql

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