我在捷克语中对重音不敏感的搜索有以下问题。我的数据库设置为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
我有一张桌子,里面放着两种类型的笔记。提货单和交货单。它们是相同的数据结构,因此使用相同的表。
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 作业,让我知道这种情况何时发生,但我更愿意首先防止它发生。
出于性能原因,我需要每周重建索引,但我可以跳过与该表关联的索引。
如何在不触及该表的情况下为数据库的其余部分重建索引?
编辑:我目前正在使用 SSIS 作业(固定维护计划)来重建数据库中所有表的所有索引。之后它会更新统计信息并检查完整性。
我正在编写一个脚本,它打算通过创建一个带有聚集索引的虚拟列然后立即删除它来对基于 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
我正在 SQL Server 表上执行 ETL 逻辑。我要将数据从一张表同步到另一张表。对于需要基于源表添加到目标表的所有记录,我正在对目标表中的这些行进行插入。架构将其中一列定义为标识列。因此 SQL Server 会自动增加插入的新行的 id。因为我要移动现有的 id,所以我需要删除标识,插入这些行,然后重新应用标识,然后重置种子以使其与源表匹配。这如何以编程方式完成?
按百分比范围对记录进行分组的更简单方法是什么。
这是我试图完成的
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% 吗?
有没有更好(更好)的方法来做到这一点。
最近我在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) 有一个快速的一般问题。我有一张桌子,我正在尝试清除一张桌子。我正在使用批次之间的时间为 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
我有一个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)
我基本上是在尝试验证该列。修剪适用于空,但也许有更简洁/灵活的方法来完成这两个验证?谢谢!
这个问题是从这里提出的优秀问题中提取出来的:
就我而言,我不关心该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 ×10
sql-server ×5
datetime ×1
etl ×1
identity ×1
index ×1
maintenance ×1
performance ×1
scripting ×1