小编use*_*re3的帖子

如何在 SQL Server 中进行比较时包含空值?

所以基本上在 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 变得非常难看。我的程序与表定义无关,这意味着我不在乎你的表中有什么,也不想知道你的表的定义是什么。我只是想让你选择一个表格,选择一些字段来过滤等于、不等于、在、不在等......

null sql-server t-sql

10
推荐指数
2
解决办法
5万
查看次数

使用 COALESCE(...) 优化子查询的选择

我有一个从应用程序中使用的大视图。我想我已经缩小了我的性能问题,但我不确定如何解决它。视图的简化版本如下所示:

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 optimization t-sql subquery

8
推荐指数
1
解决办法
4416
查看次数

复制加密的数据库视图

我需要复制一份 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)

从视图中获取包含数据的数据库副本的最佳方法是什么?我正在考虑创建额外的表并填充样本数据,但这似乎很冗长,那么有更好的方法吗?

sql-server

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

MySQL:设置 skip-errors=1062 时行会发生什么

我发现我可以skip-errors=1062在中设置,my.cnf但我需要知道发生错误时该行会发生什么。它会被悄悄丢弃吗?或者那个配置选项相当于STOP SLAVE;SQL_SLAVE_SKIP_COUNTER=1; START SLAVE;

mysql replication

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

在函数中无效使用副作用运算符“INSERT” - 在函数中多次插入

如果这不是正确的论坛,请让我知道并为我移动它。

我刚刚在标量函数的末尾有一堆这样的插入:

   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 t-sql functions

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

如何从链接服务器上的触发器获取输出

公平警告,我知道这不是最好的方法,但我正在尝试扩展一些现有代码而无需重写。

无论如何,我已经安装了两个 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)

trigger sql-server linked-server sql-server-2012

5
推荐指数
1
解决办法
1462
查看次数

DbUp 和脚本目录

我正在使用DbUp,从我创建一个 C# 程序的示例开始。该示例建议我将所有脚本放在Scripts目录下。好的,这已经完成,但是,当脚本数量增加时,该目录将变得如此混乱。

我会用版本号组织这些目录。例如

  • 1.0.0(目录)
    • CS001 - 基线.sql
  • 1.0.1(目录)
    • CS001 - 更改 x table.sql
    • CS002 - 创建 y procedure.sql
  • 1.1.0(目录)
    • CS001 - 创建视图 z.sql

显然,代码会以有序的方式处理脚本。我怎样才能做到这一点?我在哪里找到文档和其他示例?

sql-server deployment

5
推荐指数
1
解决办法
2297
查看次数

带有一个操作数的“+”运算符!

'+' 运算符在以下语句中的表现如何?

select + 'taco';  --Result is 'taco'
Run Code Online (Sandbox Code Playgroud)

它是与第一个字符串空白('' + 'taco')进行字符串连接,还是其他意思?

mysql sql-server t-sql operator

5
推荐指数
1
解决办法
261
查看次数

SQL 日志显示我找不到的登录信息

在我的 SQL Server 日志中,我显示从一个SERVER\loginnameSecurity > LoginsOR 中找不到的帐户 ( )成功登录到数据库Database > Security > Users。程序正在使用此登录名来执行任务(它成功完成),因此这不是安全隐患,但我终生无法弄清楚它在哪里,我需要找到它来进行调整。

还有一些注意事项:我确实记得不久前添加了这个特定的登录名,并且我必须这样做有一些特别之处,因为它不是域帐户。相反,它使用传递身份验证(应用程序和 SQL 服务器上的相同本地帐户名称和相同的密码)。我无法使用它通过 SSMS 登录。它不是组成员资格的一部分。当我SELECT从主syslogins表做 a 时它没有显示。

有人对我的脑放屁有什么想法吗?

security sql-server

5
推荐指数
1
解决办法
1370
查看次数

在 SQL Server 2012 上从 SQL Server 2008 R2 还原 master 数据库

我有一个过程可以在中央服务器上恢复我的所有备份以进行测试。我最近将此服务器升级到 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)

restore sql-server-2012

5
推荐指数
1
解决办法
6536
查看次数