小编Mik*_*son的帖子

迄今为止的演员阵容是可以讨论的,但这是一个好主意吗?

在 SQL Server 2008中添加了日期数据类型。

datetime列转换datesargable并且可以在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)

这些查询是同样好还是应该优先于另一个?

sql-server

51
推荐指数
2
解决办法
8365
查看次数

为什么执行语句的速度取决于网络连接?

看起来执行 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)

sql-server t-sql

31
推荐指数
1
解决办法
1042
查看次数

如何更改存储过程的架构而不重新创建它

我有一些带有“SalesTraining”模式的存储过程。我想将所有 SalesTraining 模式更改为“Sales”。有没有比重新创建存储过程更好的方法?谢谢

在此处输入图片说明

sql-server

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

查询计划“基数估计”中的警告

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

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

为什么 where 子句过滤 `value()` 时不使用二级选择性索引?

设置:

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

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

奇数流聚合行为

询问:

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 有所不同。

sql-server execution-plan

11
推荐指数
2
解决办法
1010
查看次数

使新版本的 LDF 文件与旧版本的 MDF 文件一起使用

是否可以将 LDF 文件的“新版本”与旧版本的 MDF 文件结合起来,并将更改记录在 LDF 中?让我们假设在此期间没有日志备份,因为我猜这会让这真的不可能。

脚步:

  1. 数据库处于完全恢复模式
  2. 进行完整备份
  3. 做一些改变
  4. 分离数据库
  5. 制作 LDF 文件的文件副本
  6. 从第 2 步中的完整备份还原
  7. 分离数据库
  8. 制作 MDF 文件的文件副本
  9. 扔掉备份(重要的一步)
  10. 删除数据库
  11. 不知何故,使 MDF 和 LDF 一起发挥作用,同时步骤 3 中所做的更改仍然存在。

只是附加 MDF 和 LDF 会出现错误:

传递给日志扫描数据库“mic”的日志扫描编号 (38:195:41) 无效。

我也尝试了一系列

  1. 创建数据库
  2. 使数据库脱机
  3. 替换 MDF 和 LDF 文件
  4. 上线
  5. 做一个日志备份
  6. 删除数据库
  7. 仅使用附加 MDF 文件创建数据库
  8. 进行完整备份
  9. 还原完整备份(norecovery)
  10. 从步骤 5 恢复日志备份

我有一个生动的记忆,这在一段时间内工作得很好,但后来就不行了。

此备份集中的日志终止于 LSN 38000000021300001,这对于应用于数据库还为时过早。可以还原包含 LSN 39000000006500001 的更新日志备份。

sql-server

7
推荐指数
1
解决办法
241
查看次数

最有效的订购后数据库设计

我有 post_order 列的帖子表。我将每个帖子的顺序存储在其中。当我将一行的顺序从 25 更改为 15 时,我应该将所有行从 15 更新到结尾。它适用于几行,但在数千行中最糟糕。

有没有更好的订购帖子的设计,更有效?

mysql database-design design-pattern

4
推荐指数
1
解决办法
317
查看次数

对于 xml 缺少空列

当我们使用 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)

xml sql-server

4
推荐指数
1
解决办法
7667
查看次数

如何使用 json sql server 获取此值?

如何在此 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-server json sql-server-2016

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

使用 XQuery 正确旋转 XML 列

我想透视 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)

xml pivot xquery sql-server-2014

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

SQL Server 的聚合函数忽略空值。我该如何纠正?

根据MS 的知识库

除了 COUNT,聚合函数忽略空值。

有谁知道我怎样才能让它正常工作,也就是说,如果它试图与值中的空值聚合,则返回空值?

例子:

SELECT SUM("col")
FROM (
    SELECT NULL "col"
    UNION
    SELECT 1 "col"
) test
Run Code Online (Sandbox Code Playgroud)

我希望这个查询返回NULL,而不是 1。

null sql-server aggregate

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

SQL Server 2008 将字符串转换为日期时间问题

我在表中有一个字符串列,将数据显示为 "CXL P/D 08/15/13"

我正在尝试将此列转换为日期时间,但我无法弄清楚如何仅提取日期并更改数据类型。

Cast(RIGHT(RTRIM(Trade_Date) ,8)as datetime) 我正在尝试这个声明,但它不起作用

从字符串转换日期和/或时间时转换失败。

谢谢

sql-server-2008 sql-server

0
推荐指数
1
解决办法
881
查看次数