我正在尝试使用MERGE
语句从表中插入或删除行,但我只想对这些行的一个子集进行操作。的文档MERGE
有一个措辞非常强烈的警告:
仅指定目标表中用于匹配目的的列很重要。也就是说,指定目标表中与源表的相应列进行比较的列。不要试图通过在 ON 子句中过滤掉目标表中的行来提高查询性能,例如通过指定 AND NOT target_table.column_x = value。这样做可能会返回意外和不正确的结果。
但这正是我必须做的事情才能完成我的MERGE
工作。
我拥有的数据是一个标准的项目到类别的多对多连接表(例如,哪些项目包含在哪些类别中),如下所示:
CategoryId ItemId
========== ======
1 1
1 2
1 3
2 1
2 3
3 5
3 6
4 5
Run Code Online (Sandbox Code Playgroud)
我需要做的是用新的项目列表有效地替换特定类别中的所有行。我最初的尝试是这样的:
MERGE INTO CategoryItem AS TARGET
USING (
SELECT ItemId FROM SomeExternalDataSource WHERE CategoryId = 2
) AS SOURCE
ON SOURCE.ItemId = TARGET.ItemId AND TARGET.CategoryId = 2
WHEN NOT MATCHED BY TARGET THEN
INSERT ( CategoryId, ItemId )
VALUES ( 2, ItemId ) …
Run Code Online (Sandbox Code Playgroud) 我知道 SQL Server 中的 NUMERIC 和 DECIMAL 数据类型的工作方式相同:创建它们的语法是相同的,可以存储在它们中的值的范围是相同的,等等。
但是,MSDN 文档将两者之间的关系描述为:
数字在功能上等同于十进制。
通常,当我看到限定词“功能上等效”时,这意味着这两个东西并不完全相同,而是从外部无法区分的两种不同类型。
这个含义是真的吗?NUMERIC 和 DECIMAL 之间是否存在差异,恰好在外部观察者看来表现相同?或者它们实际上是等效的,例如 NUMERIC 只是 DECIMAL 的旧同义词吗?
我一直都知道UNION
SQL 中的运算符,但直到最近才发现还有其他的集合运算符,INTERSECT
和EXCEPT
. 我一直无法找到执行第四大集合运算符的运算符,即对称差异(例如 . 的相反INTERSECT
)
看起来我可以通过使用类似的东西来获得所需的输出
SELECT Field FROM A UNION SELECT Field FROM B
EXCEPT
SELECT Field FROM A INTERSECT SELECT Field FROM B
Run Code Online (Sandbox Code Playgroud)
(假设我得到了正确的优先级),或者通过做一个反完全连接:
SELECT A.Field, B.Field
FROM A
FULL JOIN B ON B.Id = A.Id
WHERE B.Id IS NULL OR A.Id IS NULL
Run Code Online (Sandbox Code Playgroud)
但是这两个看起来都像是相当密集的查询,尤其是与其他三个基本的集合操作相比。SQL中是否存在对称差异操作而我在文档中找不到它?或者是否有一种“规范”的方式在 T-SQL 中实现它?
SQL Profiler 捕获的许多事件都包含一个二进制数据列。这些事件类的文档只是重复了这一事实,即该列包含“依赖于跟踪中捕获的事件类的二进制值”。
我对RPC:Starting
和RPC:Completed
事件特别感兴趣;我注意到,无论何时执行相同的查询,每个事件的二进制数据都是相同的,尽管开始和完成事件具有不同的二进制数据。但是其他事件也会在此处显示我对解码感兴趣的信息。当然,这假设数据甚至相关或有意义。
这些字段的内容是否记录在任何地方,对开发人员/管理员是否有意义?