在 SQL Server 2008中添加了日期数据类型。
将datetime列转换date为sargable并且可以在datetime列上使用索引。
select *
from T
where cast(DateTimeCol as date) = '20130101';
Run Code Online (Sandbox Code Playgroud)
您拥有的另一个选择是改用范围。
select *
from T
where DateTimeCol >= '20130101' and
DateTimeCol < '20130102'
Run Code Online (Sandbox Code Playgroud)
这些查询是同样好还是应该优先于另一个?
看起来执行 T-SQL 的速度取决于与服务器的网络连接的延迟。我假设如果 SQL Server 没有什么可向客户端报告的,它只会执行直到完成,但测试显示了另一个故事。
create procedure UselessLoop
@I int
as
declare @D datetime = getdate()
while @I > 0 set @I -= 1
print datediff(millisecond, @D, getdate())
Run Code Online (Sandbox Code Playgroud)
exec UselessLoop 100000
Server Milliseconds
local 53
nearby 63
faraway 660
Run Code Online (Sandbox Code Playgroud)
exec UselessLoop 1000000
Server Milliseconds
local 546
nearby 640
faraway 6183
Run Code Online (Sandbox Code Playgroud)
使用 SSMS 对来自不同计算机的同一服务器执行测试。本地从服务器执行,附近在同一个本地网络上,远处是从 500 公里外的另一个办公室执行,通过 1 Gb 光纤连接。
显然,SQL Server 和客户端之间存在一些直接依赖于执行的语句数量的通信。
我使用 Wireshark 查看传输的内容,我不能说我理解那么多,但它是一个 tcp.stream,在 22740 个数据包中交换了总共 26 MB。
一个无用的函数呢?
create function dbo.UDFUselessLoop(@I int)
returns int
as
begin
declare …Run Code Online (Sandbox Code Playgroud) create table T(ID int identity primary key)
insert into T default values
insert into T default values
go
select cast(ID as varchar(10)) as ID
from T
where ID = 1
Run Code Online (Sandbox Code Playgroud)
上面的查询在查询计划中有一个警告。
<Warnings>
<PlanAffectingConvert ConvertIssue="Cardinality Estimate" Expression="CONVERT(varchar(10),[xx].[dbo].[T].[ID],0)" />
</Warnings>
Run Code Online (Sandbox Code Playgroud)
为什么它有警告?
字段列表中的强制转换如何影响基数估计?
sql-server execution-plan type-conversion sql-server-2012 cardinality-estimates
设置:
create table dbo.T
(
ID int identity primary key,
XMLDoc xml not null
);
insert into dbo.T(XMLDoc)
select (
select N.Number
for xml path(''), type
)
from (
select top(10000) row_number() over(order by (select null)) as Number
from sys.columns as c1, sys.columns as c2
) as N;
Run Code Online (Sandbox Code Playgroud)
每行的示例 XML:
<Number>314</Number>
Run Code Online (Sandbox Code Playgroud)
查询的任务是计算T指定值为 的行数<Number>。
有两种明显的方法可以做到这一点:
select count(*)
from dbo.T as T
where T.XMLDoc.value('/Number[1]', 'int') = 314;
select count(*)
from dbo.T as T
where T.XMLDoc.exist('/Number[. eq 314]') = …Run Code Online (Sandbox Code Playgroud) performance xml sql-server execution-plan sql-server-2012 query-performance
询问:
declare @X xml = '
<item ID = "0"/>
<item ID = "1"/>
<item/>
<item/>';
select I.X.value('@ID', 'int')
from @X.nodes('/item') as I(X);
Run Code Online (Sandbox Code Playgroud)
结果:
-----------
0
1
NULL
NULL
Run Code Online (Sandbox Code Playgroud)
执行计划:
顶部分支将 XML 分解为四行,底部分支获取属性的值ID。
令我感到奇怪的是从 Stream Aggregate 运算符返回的行数。来自过滤器的 2 行是来自XML 中ID第一个和第二个item节点的属性。流聚合返回四行,每个输入行一行,有效地将内连接转换为外连接。
这是 Stream Aggregate 在其他情况下也会做的事情,还是在进行 XML 查询时只是发生了一些奇怪的事情?
我在查询计划的 XML 版本中看不到任何提示,表明此 Stream Aggregate 的行为应该与我之前注意到的任何其他 Stream Aggregate 有所不同。
是否可以将 LDF 文件的“新版本”与旧版本的 MDF 文件结合起来,并将更改记录在 LDF 中?让我们假设在此期间没有日志备份,因为我猜这会让这真的不可能。
脚步:
只是附加 MDF 和 LDF 会出现错误:
传递给日志扫描数据库“mic”的日志扫描编号 (38:195:41) 无效。
我也尝试了一系列
我有一个生动的记忆,这在一段时间内工作得很好,但后来就不行了。
此备份集中的日志终止于 LSN 38000000021300001,这对于应用于数据库还为时过早。可以还原包含 LSN 39000000006500001 的更新日志备份。
我有 post_order 列的帖子表。我将每个帖子的顺序存储在其中。当我将一行的顺序从 25 更改为 15 时,我应该将所有行从 15 更新到结尾。它适用于几行,但在数千行中最糟糕。
有没有更好的订购帖子的设计,更有效?
当我们使用 for xml 子句从一行创建 xml 时,如下所示
select * from Menus where MenuID=100 for xml path('')
Run Code Online (Sandbox Code Playgroud)
xml 将错过具有 NULL 作为值的列。
我有一个像
select * from Menus where MenuID=100 for xml path('') , ELEMENTS XSINIL
Run Code Online (Sandbox Code Playgroud)
但是 xml 只会创建如下
<MenuID xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">100</MenuID>
<MenuOrder xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">1</MenuOrder>
Run Code Online (Sandbox Code Playgroud)
有没有办法用NULL列创建如下
<MenuID>100</MenuID>
<MenuOrder>1</MenuOrder>
Run Code Online (Sandbox Code Playgroud) 如何在此 json 文件中获取question_id字段?我试过了,但它返回null。
DECLARE @json NVARCHAR(MAX)
SET @json =
N'{
"solution": "xxxxxxxxxxxxxxxxxxxxx",
"options": [
{
"choice_id": 205073,
"choice": "aaaa"
},
{
"choice_id": 205074,
"choice": "bbbb"
},
{
"choice_id": 205075,
"choice": "cccc"
},
{
"choice_id": 205076,
"choice": "dddd"
}
],
"question_id": 12345
}'
SELECT * FROM
OPENJSON ( @json, '$.options')
WITH (
choice_id varchar(8000) '$.choice_id',
question_id int '$.question_id'
)
Run Code Online (Sandbox Code Playgroud)
结果
我想透视 SQL XML 列的属性和值,并以有序的列和行格式显示它。
首先,这是 XML 列在 SQL 中的样子:
<Model xmlns:dsc="ModelDescriptive" xmlns:draw="ModelDraw" xmlns:display="Display" xmlns:thd="Model3D">
<dsc:Model name="15DE">
<dsc:Defs>
<dsc:Materials>
<dsc:Material ref="E-HD-AnoAno" baseRef="E-HD" type="rod" productionGroup="OPTION" />
<dsc:Material ref="E-3L44A-CLEAR" baseRef="E-3L44A" type="piece" productionGroup="OPTION" />
<dsc:Material ref="R-TH01" baseRef="R-TH-TH" type="rod" productionGroup="ASSEMBLY" />
<dsc:Material ref="M-TH05" baseRef="M-TH" type="meter" productionGroup="MOLDING" />
</dsc:Materials>
</dsc:Defs>
</dsc:Model>
</Model>
Run Code Online (Sandbox Code Playgroud)
...这是我的查询:
SELECT
x.y.value('local-name(..)', 'VARCHAR(MAX)') ParentElementName
,x.y.value('local-name(.)', 'VARCHAR(MAX)') Attribut
,x.y.value('.', 'VARCHAR(MAX)') Value
,Row_number() Over(Partition by x.y.value('local-name(..)', 'VARCHAR(MAX)') order by x.y.value('local-name(..)', 'VARCHAR(MAX)') ASC) as rn
FROM @xmlDescriptive.nodes('//*[text()], //@*') AS x(y)
WHERE x.y.value('local-name(..)', 'VARCHAR(MAX)')= 'Material'
ORDER BY …Run Code Online (Sandbox Code Playgroud) 根据MS 的知识库,
除了 COUNT,聚合函数忽略空值。
有谁知道我怎样才能让它正常工作,也就是说,如果它试图与值中的空值聚合,则返回空值?
例子:
SELECT SUM("col")
FROM (
SELECT NULL "col"
UNION
SELECT 1 "col"
) test
Run Code Online (Sandbox Code Playgroud)
我希望这个查询返回NULL,而不是 1。
我在表中有一个字符串列,将数据显示为 "CXL P/D 08/15/13"
我正在尝试将此列转换为日期时间,但我无法弄清楚如何仅提取日期并更改数据类型。
Cast(RIGHT(RTRIM(Trade_Date) ,8)as datetime) 我正在尝试这个声明,但它不起作用
从字符串转换日期和/或时间时转换失败。
谢谢
sql-server ×11
xml ×3
aggregate ×1
json ×1
mysql ×1
null ×1
performance ×1
pivot ×1
t-sql ×1
xquery ×1