我们公司正在与另一家软件公司进行联合项目的接口,我们被告知,如果不应该显示特定值,我们应该传入 -5000(他们的任意标记值);原因是他们的 Oracle 数据库中没有数字列支持空值,这是根据他们(现在是前任)Oracle 开发人员的建议。这家公司还在 VB6 中编写了绝大多数代码(慢慢过渡到 VB.NET,这是另一天的另一个话题......)。出于纯粹的好奇,这个推荐有什么正当理由吗?我想不出任何站在我这边的人。
- - 编辑
感谢大家的反馈。我在 CodeProject.com(链接)上提出了同样的问题,并收到了非常相似的反馈。似乎唯一一次可以开始证明这种做法是与外键有关的,我可以声明它们在系统中的任何地方都没有使用外键。做出此决定的开发人员(我曾经在该公司工作)的经验比我多得多,因此我想确保在遭到嘲笑之前没有正当理由。
我有两个更新——一个先锁定 CI,然后锁定 NCI(状态),因为状态列也在更新。另一个已经拥有 NCI 上的 U 锁,因为它知道它正在更改,然后尝试在 CI 上获得 U 锁。
强制这些序列化的最简单方法是什么?使用 TABLE 级提示似乎很奇怪,因为这是一个内部索引问题——只涉及一个表——UPDLOCK、HOLDLOCK 是否会自动应用于该表所需的所有索引,从而强制它被序列化?
以下是查询:
UPDATE htt_action_log
SET status = 'ABORTED', CLOSED = GETUTCDATE()
WHERE transition_uuid = '{F53ADDDA-E46B-4726-66D8-D7B640B66597}'
AND status = 'OPEN';
Run Code Online (Sandbox Code Playgroud)
该 X 锁定 CI 中的行(在 CREATED 列上),然后尝试 X 锁定包含状态列的 NCI。
UPDATE htt_action_log
SET status = 'RUNNING {36082BCD-EB52-4358-E3D3-4D96FD5B9F0F} 1360094342'
WHERE action_uuid = (SELECT TOP 1 action_uuid
FROM htt_action_log
WHERE transition_uuid = '{F53ADDDA-E46B-4726-66D8-D7B640B66597}'
AND status = 'OPEN'
ORDER BY action_seq)
Run Code Online (Sandbox Code Playgroud)
这个 U 锁定相同的 NCI - 我猜是嵌套查询,然后去锁定 CI 以进行更新。
因此订单产生了死锁。 …
当我在命令行上指定 /ConfigFile something.dtsConfig 时,2008 年包配置与 2005 年相比发生了变化,包中定义的变量将保留其设计时值,而不是使用配置文件中的设置。
我不太确定我完全理解如何获取要使用的外部配置文件。我读过一些文章,说只有设置的设计时配置才会覆盖外部文件的负载。这是否意味着我可以将变量更改为空字符串,然后它们会被覆盖?我不能完全删除变量!整数呢?
我看过一些文章提到使用包中的包配置关闭。
我可以使用 SSIS 包编辑器或 XML 编辑器来更改包中的配置文件路径,然后它将“最后”使用该文件的设置(无论外部 /ConfigFile 选项如何),但我不想成为改变包。我想要一个带有 Test.dtsConfig 和 Production.dtsConfig 的包,并且能够在不更改包的情况下来回交换。
现在推荐的方法是什么?
SET NOCOUNT ON;
DECLARE @xml AS Xml = '<a><b>bbb</b><c>ccc</c><d>ddd</d></a>';
SELECT @xml;
SELECT @xml.query('/a/*[self::b or self::c]');
SET @xml.modify('delete /a/d');
SELECT @xml;
Run Code Online (Sandbox Code Playgroud)
给出以下结果集
原来的:
<a><b>bbb</b><c>ccc</c><d>ddd</d></a>
Run Code Online (Sandbox Code Playgroud)
过滤以排除非 (b|c) - 但缺少父母:
<b>bbb</b><c>ccc</c>
Run Code Online (Sandbox Code Playgroud)
我想要什么(可用于删除步骤,但不可用于 .query):
<a><b>bbb</b><c>ccc</c></a>
Run Code Online (Sandbox Code Playgroud)
是否可以在 XQuery 中保留父项?
我在 VM 中有一个共享的 SQL Server 2016 开发实例,与(应该是)相同 VM 上的共享 SQL Server 2012 开发实例相比,该实例的 INSERT 性能较差。它与我的本地 SQL Server 2016 开发实例相比也很差,因此我目前假设该实例存在一些古怪的问题,因为该服务器上的大多数其他操作似乎相当稳定。
它们是以下形式的 1000 个单独的插入语句:
INSERT INTO tblname (columnlist) VALUES (literals);
没有明确的交易。
我将这些 INSERT 包装在扩展事件中,以便我可以看到一些环境之间的差异。我还制作了一个运行循环而不是文字的版本。循环的性能在受影响的系统上明显不同,我不包括下面的循环版本代码 - 它执行一致,但在执行该脚本之前我确实删除并重新创建了数据库,结果也包括在内。
我已将系统设置为可重现并轻松推送到任何系统进行比较。我正在运行命令脚本和 sqlcmd 中的所有内容。首先运行安装脚本以创建数据库、表和 XE 会话。然后运行第二个脚本,启动跟踪,执行 1000 条 INSERT VALUES 语句,停止跟踪并使用https://www.sqlskills.com/blogs/paul/capturing-wait-stats-for-a-single-显示结果手术/
我已经注意到这个特定的 SQL Server 2016 在 SOS_SCHEDULER_YIELD 周围有非常不同的特征,我想知道这是否已经指出潜在的问题可能是什么。此外,我似乎已将此问题与在此服务器上的默认值中使用 GETDATE 和 GETUTCDATE 隔离开来。
性能测试.cmd:
DEL *.xel
echo Running setup.sql
sqlcmd -o "setup.sql.output-1.txt" -I -b -l 120 -t 300 -S %SQLINSTANCE% -U sa -P %PASSWORD% -d …Run Code Online (Sandbox Code Playgroud) 我有一个死锁图,其中一个进程正在执行 SELECT 并且一个进程正在执行 UPDATE。这似乎是 SELECT 获取 NCI 锁以执行连接,然后获取 CI 锁以通过查找检索所有数据的经典案例。UPDATE 使用 CI 锁执行更新,然后需要锁定 NCI,因为更新会导致状态更改,并且 NCI 有助于按状态查找项目。
问题是 UPDATE 想要的锁之一不在它正在更新的表上,我找不到为什么会发生这种情况。
这是选择:
SELECT *,
RIGHT(c.CC_NUMBER, 4) AS CC_LAST_4,
DATEDIFF(ss, '1970-01-01', plan_started ) plan_started_epoch,
DATEDIFF(ss, '1970-01-01', plan_expires ) plan_expires_epoch
FROM customers c, accounts a, parent_cos pc, htt_customers_overlay_ultra u
WHERE c.customer_id = a.customer_id
AND u.customer_id = c.customer_id
AND a.cos_id=pc.cos_id
AND u.customer_id = 9300;
Run Code Online (Sandbox Code Playgroud)
这是更新:
UPDATE htt_customers_overlay_ultra SET plan_state = 'Active' WHERE customer_id = 9300;
Run Code Online (Sandbox Code Playgroud)
但是根据死锁图,UPDATE是在ACCOUNTS.ACCOUNT0上获取锁,也就是ACCOUNTS表的PK(CI)。覆盖表中没有外键。有一些我目前无权查看的默认约束。
我查看了 SSMS 和 SQL Sentry Plan Explorer …
是否有一个更简单的 T-SQL 构造“所有这些列在一行上都相等(忽略 NULL)” - 我想说有效:
WHERE MIN(a, b, c) = MAX(a, b, c) OR COALESCE(a, b, c) IS NULL
Run Code Online (Sandbox Code Playgroud)
3 列的替代方法是:
WHERE (
COALESCE(a, b, c) = COALESCE(b, c, a)
AND COALESCE(a, b, c) = COALESCE(c, a, b)
AND COALESCE(a, b, c) = COALESCE(b, a, c)
AND COALESCE(a, b, c) = COALESCE(a, c, b)
AND COALESCE(a, b, c) = COALESCE(c, b, a)
)
OR COALESCE(a, b, c) IS NULL
Run Code Online (Sandbox Code Playgroud)
即“所有非空列 a、b、c 必须相等,否则所有列都可能为空” …
我有一个关于这个小提琴的问题:
DECLARE @TestVal AS float = 8.88;
SELECT flt = @TestVal
, xml = (SELECT Value = @TestVal FOR XML PATH(''), TYPE)
, fmt17 = FORMAT(@TestVal, 'G17')
, fmt = FORMAT(@TestVal, 'G')
, cst = CAST(@TestVal AS nvarchar(50))
, fmt17_roundtrip = CAST(FORMAT(@TestVal, 'G17') AS float)
, fmt_roundtrip = CAST(FORMAT(@TestVal, 'G') AS float)
, cst_roundtrip = CAST(CAST(@TestVal AS nvarchar(50)) AS float)
;
Run Code Online (Sandbox Code Playgroud)
https://dbfiddle.uk?rdbms=sqlserver_2019&fiddle=0cf05f882eb24f53e9484f043af99446
我在默认情况下以科学记数法输出某些 XML 时遇到了麻烦,虽然这些 XML 不正确或不准确,但可读性并不差。
我最初使用 FORMAT(floatcol, 'G17') 因为这个文档页面上的评论:
请注意,当与 Double 值一起使用时,“G17”格式说明符可确保原始 Double 值成功往返。这是因为 Double 是符合 …
从编辑窗口打开 .sql 文件时,是否有一个选项可以告诉它停止提示我拆分包含多个对象的文件?我从不想拆分文件!
根据我目前的理解,服务的名称对于实例是全局的,您可以在不知道哪个数据库包含服务和关联队列等的情况下引用它们。此外,您可以在同一实例的不同数据库中拥有相同的服务,并且在这种情况下,您应该使用路由,也可以在开始对话对话时使用 service_broker_guid 来区分它们。
有没有比在所有数据库中查看服务名称存在于哪些数据库中更好的方法?
sys.services 目录视图仅限于特定数据库上下文中,可以是当前数据库,也可以使用完全限定的 database_name.sys.services 进行调用。
特别是,我有一些触发器需要向另一个数据库中的服务发送消息,但是如果服务不存在,或者如果该服务有两个数据库,或者数据库名称是不同等
如果性能太慢而无法每次都在触发器中进行所有这些安全检查,我可以进行定期维护检查以删除它们,但是无论触发器是否一直存在,我仍然想知道是否有最好的方法服务在实例中完全定义在一个或多个数据库中。
我确实设法提出了这个动态 SQL,但这可能必须在 proc 或其他东西中进行:
USE master;
DECLARE @DatabasePattern AS varchar(max) = '%';
DECLARE @ServicePattern AS varchar(max) = '%';
DECLARE @SQLTemplate AS varchar(max) = 'UNION ALL
SELECT database_id = {database_id}
, database_name = ''{database_name}''
, service_name = s.[name]
, service_broker_guid = ''{service_broker_guid}''
FROM {database_name}.sys.services s
WHERE s.[name] LIKE ''' + REPLACE(@ServicePattern, '''', '''''') + '''
';
DECLARE @SQL AS varchar(max);
WITH Statements AS (
SELECT SQL = REPLACE(REPLACE(REPLACE(@SQLTemplate
,'{database_id}', db.[database_id])
,'{database_name}', …Run Code Online (Sandbox Code Playgroud)