我想查看特定记录占用了多少 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.
我正在尝试在同一查询中插入数据然后删除数据。
我试图将其分块删除,以免导致日志问题:
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)
但同样的查询,我想先在辅助数据库中插入数据,然后删除。
是否可以在没有触发器的情况下实现?(插入、删除……)
我也愿意接受更好的分块删除方法,我只是凭记忆得到了这个方法。
当我的查询中有多个错误,并且我在 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 文件,用于执行一些测试:
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) 我有一段用 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 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我试图获得表中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 | 巧克力 … |
在 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) 最近,我意识到临时存储过程,并为我在职业生涯中从未见过它们使用过而感到震惊。当我记得这CREATE PROCEDURE必须是其批次的第一个语句时,我感到非常失望,这肯定限制了它们的使用。当我看到他们在这个网站上很少被提及时,我支持了这个想法。他们甚至没有标签!
临时存储过程的惯用用例是什么?他们如何避免因需要成为批次中的第一个语句而造成的限制?
我有以下 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)