标签: t-sql

MS SQL Server 2008 R2 中的捷克语排序规则 Czech_CI_AI 的问题

我在捷克语中对重音不敏感的搜索有以下问题。我的数据库设置为Czech_CI_AI整理。对于某些变音符号系统正常工作(即I),但对于某些不正常(即R)。在我的数据库中有几条'DVORA*'记录:

SELECT contact_name 
FROM   CONTCTSM1 
WHERE  CONTACT_NAME LIKE 'DVO%' 
Run Code Online (Sandbox Code Playgroud)

结果:

DVO?Á?KOVÁ,
IVETA DVO?Á?KOVÁ,
JI?INA DVO?ÁK

sql-server-2008 t-sql

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

如何根据表中的另一列创建不同的顺序值集?

我有一张桌子,里面放着两种类型的笔记。提货单和交货单。它们是相同的数据结构,因此使用相同的表。

CREATE TABLE Notes (
   Id int IDENTITY(1,1) NOT NULL,
   Type int  NOT NULL,
   CustomerId int NOT NULL,
   -- etc
)
Run Code Online (Sandbox Code Playgroud)

我正在将数据从旧系统迁移到此表中,并且要求收款和交付票据具有自己的序列号。

我之前已经实现了两个序列表

CREATE TABLE CollectionNoteSequence (
    Id int IDENTITY(1,1) NOT NULL,
    NoteId int NOT NULL
)
Run Code Online (Sandbox Code Playgroud)

其中该Id列是收藏笔记的唯一顺序 ID,然后是 NoteId 外键的 to Notes.Id

现在是进行最终(真实)数据迁移的时候了,而且这种设置似乎很难使用。

有没有办法可以将两个序列表合并并NoteNo在 Notes 表中添加一个字段,以便NoteNo根据Note.Type? 这是复合键还是什么?

新表可能看起来像

CREATE TABLE Notes (
   Id int IDENTITY(1,1) NOT NULL,
   NoteNo int NOT NULL,
   Type int  NOT NULL,
   CustomerId int NOT NULL,
   -- …
Run Code Online (Sandbox Code Playgroud)

sql-server-2008 t-sql

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

除了一张表外,我可以在数据库中重建索引吗?

我的数据库中有一个表,该表由应用程序服务器不断监视以进行更改。不幸的是,重建与此表相关的索引会中断应用服务器的连接。这会导致应用服务器上的打印作业和各种其他进程以静默方式失败。

我创建了一个小型监控 SQL 作业,让我知道这种情况何时发生,但我更愿意首先防止它发生。

出于性能原因,我需要每周重建索引,但我可以跳过与该表关联的索引。

如何在不触及该表的情况下为数据库的其余部分重建索引?

编辑:我目前正在使用 SSIS 作业(固定维护计划)来重建数据库中所有表的所有索引。之后它会更新统计信息并检查完整性。

sql-server maintenance t-sql sql-server-2008-r2

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

通过创建聚集索引并立即删除它来对 HEAP 进行碎片整理

我正在编写一个脚本,它打算通过创建一个带有聚集索引的虚拟列然后立即删除它来对基于 HEAP 的表进行碎片整理。(这是别人的应用程序,我不想进行任何永久性更改 - 不过他们做得很好。)

ALTER TABLE my_heap ADD dummy BIGINT IDENTITY;
GO
CREATE CLUSTERED INDEX ix_dummy ON my_heap (dummy);
GO
-- need to wait here until index completes
DROP INDEX ix_dummy ON my_heap;
ALTER TABLE my_heap DROP COLUMN dummy;
GO
Run Code Online (Sandbox Code Playgroud)

当我运行脚本的各个步骤时,它工作正常。当我一次运行它时,似乎什么也没有发生(碎片级别不会下降)。我相信这是因为 DROP 发生在 CREATE CLUSTERED 完成之前 - 所以 CREATE CLUSTERED 没有时间做它的事情。

如何让 DROP 等待 CREATE CLUSTERED 完成?我正在为大约 30 张桌子这样做,所以我不想为每张桌子设置一个简单的等待延迟 15 分钟。

PS 使用 SQL Server 2005

index sql-server-2005 clustered-index scripting t-sql

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

在保留 IDENTITY 的同时将行插入其他表

我正在 SQL Server 表上执行 ETL 逻辑。我要将数据从一张表同步到另一张表。对于需要基于源表添加到目标表的所有记录,我正在对目标表中的这些行进行插入。架构将其中一列定义为标识列。因此 SQL Server 会自动增加插入的新行的 id。因为我要移动现有的 id,所以我需要删除标识,插入这些行,然后重新应用标识,然后重置种子以使其与源表匹配。这如何以编程方式完成?

  1. 我可以从现有列中删除身份声明吗?
  2. 我可以将现有列标记为身份吗?
  3. 如何重置标识列的种子?

sql-server-2008 sql-server etl t-sql identity

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

在 SQL Server 中使用范围按百分比查找最高值

按百分比范围对记录进行分组的更简单方法是什么。

这是我试图完成的

Select top percents between 50 and 75 * from myTable order by PKI
Run Code Online (Sandbox Code Playgroud)

这是我这样做的方式,但我觉得它云要容易得多

select 
    top(25) percent 
     *
from myTable
where id not in (
            select 
                top(25) percent 
                 ID
            from myTable
            order by PKI
            )
order by PKI
Run Code Online (Sandbox Code Playgroud)

这应该是我表的前 50-75% 吗?

有没有更好(更好)的方法来做到这一点。

sql-server t-sql sql-server-2008-r2

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

剖析连接

最近我在dba.stackexchange 中问了一个问题,这个问题是关于 sql 中的数据层次结构的,一个叫chris allen 的人回答了这个问题,我真的很喜欢它,但是当我试图理解这个查询时,我更加困惑了。

这是查询:

Res_id  Res_name         Man_id
1           sam             3
2           Biju            4
3           adrian          Null
4           Helen           3
5           Micah           4


select  
 level1.res_name as level1,
 level2.res_name as level2,
 level3.res_name as level3,
 level4.res_name as level4,
 level5.res_name as level5

from resource as level1
left join resource as level2 on level1.res_id=level2.man_id
left join resource as level3 on level2.res_id=level3.man_id
left join resource as level4 on level3.res_id=level4.man_id
left join resource as level5 on level4.res_id=level5.man_id

where …
Run Code Online (Sandbox Code Playgroud)

sql-server t-sql

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

运行 DELETE 存储过程,但发现 WHILE 循环中的性能随着迭代次数的增加而下降

有一个快速的一般问题。我有一张桌子,我正在尝试清除一张桌子。我正在使用批次之间的时间为 50 毫秒和每批次 2000 条记录的WHILE循环进行删除WAITFOR DELAY。真正的问题是,随着时间的推移,删除的记录数量会随着时间的推移而下降。请参阅以下内容:

Minute Number | Number of Records Deleted:

            1 | 162,000 
            2 | 116,000 
            3 |  80,000 
            4 |  72,000 
            5 |  62,000 
            6 |  38,000 
            7 |  38,000 
            8 |  34,000 
            9 |  20,000
Run Code Online (Sandbox Code Playgroud)

想知道使用WHILE循环批处理删除记录是否有一些基本的东西会导致性能随着循环的每次迭代而降低。我们一直在手动观察性能,然后在性能在第 5 到第 6 分钟左右开始急剧下降时停止 proc,然后再次重新启动部署。我们不认为这是一个直接的锁定问题,因为当我们使用批量大小时,性能总是在 5 到 6 分钟左右下降。

performance sql-server t-sql sql-server-2008-r2 performance-tuning

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

如何查找具有所有相同重复字符的列

我有一个char(15) NOT NULL专栏。我需要查看它是否为空或包含全零。我显然可以做到= '000000000000000'但是有没有办法使用LIKE它而不是硬编码为 15?我不明白为什么[^0]下面不匹配所有零。

CASE WHEN LTRIM(RTRIM(IL.ItemNumber)) = '' THEN 1 ELSE 0 END IsEmpty
CASE WHEN LTRIM(RTRIM(IL.ItemNumber)) <> '' AND LTRIM(RTRIM(IL.ItemNumber)) NOT LIKE '[^0]' THEN 1 ELSE 0 END IsZeros
Run Code Online (Sandbox Code Playgroud)

我基本上是在尝试验证该列。修剪适用于空,但也许有更简洁/灵活的方法来完成这两个验证?谢谢!

t-sql sql-server-2008-r2

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

我应该使用强制转换或范围将日期时间加入日期吗?

这个问题是从这里提出的优秀问题中提取出来的:

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

就我而言,我不关心该WHERE子句,而是关心加入具有类型列的事件表DATE

一个表有DATETIME2,另一个有DATE......所以我可以有效地JOIN使用aCAST( AS DATE)或者我可以使用“传统”范围查询(>=日期和<日期+1)。

我的问题是哪个更可取?这些DATETIME几乎永远不会与谓词DATE值匹配。

我希望保持在 200 万行DATETIME和 5000行以下DATE(如果这个考虑有所不同)

我是否应该期望在JOIN使用该WHERE子句时具有相同的行为?我应该更喜欢哪个通过缩放来保持性能?答案是否随 MSSQL 2012 而改变?

我的通用用例是将我的事件表视为日历表

SELECT
    events.columns
    ,SOME_AGGREGATIONS(tasks.column)
FROM
    events
LEFT OUTER JOIN
    tasks
        --This appropriately states my intent clearer
        ON CAST(tasks.datetimecolumn AS DATE) = events.datecolumn 
        --But is this more effective/scalable?
        --ON tasks.datetimecolumn >= events.datecolumn 
        --AND tasks.datetimecolumn < DATEADD(day,1,events.datecolumn)
GROUP BY
    events.columns
Run Code Online (Sandbox Code Playgroud)

t-sql sql-server-2008-r2 sql-server-2012 datetime

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