所以基本上在 SQL Server 中,NULL 意味着没有值,因此无法比较它返回一些意外的结果。
例如,以下查询不会返回值为 NULL 的行,但我希望它返回:
SELECT *
FROM table
WHERE
(value != 26)
AND date IS NULL
AND last_modified >= '5/21/2014'
Run Code Online (Sandbox Code Playgroud)
我知道我可以做以下作为一种解决方法,但认真吗?每次我想包含它时,都必须添加括号并检查每个字段是否为空?看起来丑陋,不直观和疯狂。
SELECT *
FROM table
WHERE
(value != 26 OR value is null)
AND date IS NULL
AND last_modified >= '5/21/2014'
Run Code Online (Sandbox Code Playgroud)
我的意思是我知道 NULL 不是一个值,因此无法进行比较,但您不能推断它实际上绝对不是 26 吗?如果 26 是什么,NULL 是什么,什么都不是什么,那么 NULL 不是 26。对我来说似乎是合乎逻辑的。
有谁知道我如何以更简洁的方式在使用比较时在结果中包含空值,而不必每次都包含显式检查。同样关闭我的表上的空值绝对不是一种选择。
编辑:
我为什么不想像我展示的那样做的真正问题并没有暴露出来。所以就到这里了。我正在编写一个程序,让您构建对数据库表的查询,让用户动态创建过滤器等,基本上在一天结束时构建 SQL 语句并将结果显示给用户。用户选择的字段可以是给定数据库中的任何和/或所有字段,如果我必须逐字地将 ISNULL 检查放在每个字段上,这将非常低效,并使查看 SQL 变得非常难看。我的程序与表定义无关,这意味着我不在乎你的表中有什么,也不想知道你的表的定义是什么。我只是想让你选择一个表格,选择一些字段来过滤等于、不等于、在、不在等......
我有一个从应用程序中使用的大视图。我想我已经缩小了我的性能问题,但我不确定如何解决它。视图的简化版本如下所示:
SELECT ISNULL(SEId + '-' + PEId, '0-0') AS Id,
*,
DATEADD(minute, Duration, EventTime) AS EventEndTime
FROM (
SELECT se.SEId, pe.PEId,
COALESCE(pe.StaffName, se.StaffName) AS StaffName, -- << Problem!
COALESCE(pe.EventTime, se.EventTime) AS EventTime,
COALESCE(pe.EventType, se.EventType) AS EventType,
COALESCE(pe.Duration, se.Duration) AS Duration,
COALESCE(pe.Data, se.Data) AS Data,
COALESCE(pe.Field, se.Field) AS Field,
pe.ThisThing, se.OtherThing
FROM PE pe FULL OUTER JOIN SE se
ON pe.StaffName = se.StaffName
AND pe.Duration = se.Duration
AND pe.EventTime = se.EventTime
WHERE NOT(pe.ThisThing = 1 AND se.OtherThing = 0)
) Z …
Run Code Online (Sandbox Code Playgroud) 我需要复制一份 SQL Server 数据库。该数据库有大约 40 个链接到其他数据库的视图,我也需要来自这些视图的示例数据。此外,视图已加密,因此当我尝试从其中一个视图生成脚本时,这是错误:
Property TextHeader is not available for View '[dbo].[TABLE1]'. This property may not
exist for this object, or may not be retrievable due to insufficient access rights. The
text is encrypted. (Microsoft.SqlServer.Smo)
Run Code Online (Sandbox Code Playgroud)
从视图中获取包含数据的数据库副本的最佳方法是什么?我正在考虑创建额外的表并填充样本数据,但这似乎很冗长,那么有更好的方法吗?
我发现我可以skip-errors=1062
在中设置,my.cnf
但我需要知道发生错误时该行会发生什么。它会被悄悄丢弃吗?或者那个配置选项相当于STOP SLAVE;SQL_SLAVE_SKIP_COUNTER=1; START SLAVE;
如果这不是正确的论坛,请让我知道并为我移动它。
我刚刚在标量函数的末尾有一堆这样的插入:
INSERT INTO [Raptor].[dbo].[UserRole]
([RoleId]
,[UserId])
VALUES
(3
,@NewUserID)
INSERT INTO [Raptor].[dbo].[UserRole]
([RoleId]
,[UserId])
VALUES
(5
,@NewUserID)
Run Code Online (Sandbox Code Playgroud) 公平警告,我知道这不是最好的方法,但我正在尝试扩展一些现有代码而无需重写。
无论如何,我已经安装了两个 SQL Server 2012,一个在我的办公室本地,另一个在远程站点。远程站点的服务器为我的本地系统设置了链接服务器。
远程站点的应用程序将记录插入链接服务器上具有INSTEAD OF
触发器的表中。该触发器的末尾有一个 select 语句,它返回一个整数值。如果我在 SSMS 的本地框上插入,我会得到整数作为输出。如果我在远程盒子上插入,我得到的只是1 row(s) affected
.
无论如何我可以将触发器的输出传递回链接服务器还是我需要重写为存储过程?
以下文本基于评论中要求的澄清
所有连接都是在远程端的单个用户的安全上下文中进行的。如果我EXECUTE AS USER
在本地服务器上使用插入而不是通过链接进行插入,则输出会按预期显示,因此这不是帐户的权限问题。
服务器选项是:
Collation Compatible=False
Data Access=True
RPC=True
RPC Out=True
Use Remote Collation=True
Collation Name=(blank)
Connection Timeout=0
Query Timeout=0
Distributor=False
Publisher=False
Subscriber=False
Lazy Schema Validation=False
Enable Promotion of Distributed Transaction=True
Run Code Online (Sandbox Code Playgroud) 我正在使用DbUp,从我创建一个 C# 程序的示例开始。该示例建议我将所有脚本放在Scripts目录下。好的,这已经完成,但是,当脚本数量增加时,该目录将变得如此混乱。
我会用版本号组织这些目录。例如
显然,代码会以有序的方式处理脚本。我怎样才能做到这一点?我在哪里找到文档和其他示例?
'+' 运算符在以下语句中的表现如何?
select + 'taco'; --Result is 'taco'
Run Code Online (Sandbox Code Playgroud)
它是与第一个字符串空白('' + 'taco')进行字符串连接,还是其他意思?
在我的 SQL Server 日志中,我显示从一个SERVER\loginname
在Security > Logins
OR 中找不到的帐户 ( )成功登录到数据库Database > Security > Users
。程序正在使用此登录名来执行任务(它成功完成),因此这不是安全隐患,但我终生无法弄清楚它在哪里,我需要找到它来进行调整。
还有一些注意事项:我确实记得不久前添加了这个特定的登录名,并且我必须这样做有一些特别之处,因为它不是域帐户。相反,它使用传递身份验证(应用程序和 SQL 服务器上的相同本地帐户名称和相同的密码)。我无法使用它通过 SSMS 登录。它不是组成员资格的一部分。当我SELECT
从主syslogins
表做 a 时它没有显示。
有人对我的脑放屁有什么想法吗?
我有一个过程可以在中央服务器上恢复我的所有备份以进行测试。我最近将此服务器升级到 SQL Server 2012,现在从 SQL Server 2008 R2 恢复主服务器时出现错误。从 SQL Server 2012 和 SQL Server 2005 还原工作正常。尝试恢复到 SQL 2014 时,我也得到了相同的结果。
这是我的恢复声明:
RESTORE DATABASE masttest
FROM DISK = 'c:\temp\master.bak'
WITH MOVE 'master' TO 'c:\temp\masttest.mdf',
MOVE 'mastlog' TO 'c:\temp\masttest.ldf';
Run Code Online (Sandbox Code Playgroud)
这就是结果。数据库最终处于恢复挂起状态。
Processed 400 pages for database 'masttest', file 'master' on file 1.
Processed 3 pages for database 'masttest', file 'mastlog' on file 1.
Converting database 'masttest' from version 661 to the current version 706.
Database 'masttest' running the upgrade step from version 661 …
Run Code Online (Sandbox Code Playgroud) sql-server ×8
t-sql ×4
mysql ×2
deployment ×1
functions ×1
null ×1
operator ×1
optimization ×1
replication ×1
restore ×1
security ×1
subquery ×1
trigger ×1