标签: sql-server

如何用连接替换这个 where 子句?

通常,当我看到使用以下内容的 SQL 时:

select * from employees where epmloyeeTypeId in (select id from type where name = 'emp') 
Run Code Online (Sandbox Code Playgroud)

where用这个替换:

select e.* from employees e 
inner join type t on t.id=e.epmloyeeTypeId and t.name = 'emp'
Run Code Online (Sandbox Code Playgroud)

如果它是一个not in(如下所示)而不是一个in子句,是否可以对逆做同样的事情?

INSERT into Subscriptions(ProjectId, RecordTypeCID, NTID, Active, Added, LastUpdate, UpdateBy)   
 SELECT @ProjectId, RecordTypeCID, @NTID, 1, GETDATE(), GETDATE(), @NTID  
 FROM @Check CHK  
 WHERE CHK.ActiveStatus=1  
        And Not Exists (SELECT SubscriptionId FROM Subscriptions  
                        WHERE ProjectId=@ProjectId           
                        and NTID=@NTID          
                        and RecordTypeCID = CHK.RecordTypeCID
                        ) …
Run Code Online (Sandbox Code Playgroud)

sql-server-2005 sql-server except

8
推荐指数
2
解决办法
5048
查看次数

SQL Server - RangeX-X 和 RangeI-N 锁

我在死锁分析中遇到了死点。根据msdn

RangeX-X 为 Exclusive range,独占资源锁;在更新范围内的键时使用。RangeI-N 是插入范围,空资源锁;用于在将新键插入索引之前测试范围。

所以我明白,如果我在 2 个键列上有一个索引 - 并且我插入一个新键,我将拥有 RangeI-N 锁,但如果我从索引更新现有键,我将拥有 RangeX-X。

但我的问题或多或少复杂。假设我在 A、B 列和 C 列上有索引 IX_keys_included。

在 Serializable 隔离模式下,我为包含的列 C 插入一个新值。索引 IX_keys_included 是否会有 RangeI-N 或 RangeX-X 锁?实际上,鉴于我为索引中包含的列插入了一个新列,是否会有任何锁定?

sql-server locked-objects locking

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

我需要做什么来确保我的数据库策略必须通过安全审计?

我即将进行审计,我想知道审计员在审计 ERP 系统的数据库时会寻找哪些物理、电子和逻辑访问控制。我对这个过程真的很陌生,任何指导将不胜感激。

oracle security sql-server audit

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

大型SQL Server数据库设计建议

我们正在 MSSQL 2008 R2 标准中创建一个数据库,我们将在其中存储大量记录。我们估计每年在一张表中有 2 亿多条记录,我们主要是在数据上进行极少更新或删除的插入。它是一个数据存档系统,我们每天都在其中插入历史记录。我们将根据用户请求生成关于此历史记录的不同类型的报告,因此我们有一些担忧并需要技术投入和建议。

  • 管理这种归档表和数据库的最佳方法是什么?

data-warehouse database-design sql-server database-recommendation

8
推荐指数
3
解决办法
2190
查看次数

批量数据导入建议

我们正在开展一个项目,该项目需要每天从 Excel 电子表格中导入数据。数据将从预定义的模板中导入,我们在想什么,首先我们将数据上传到临时表中并执行清理操作(删除不必要的信息,在父表中添加新行并获取它们的FK等)。

  • 我需要知道是否有任何可用的工具或实用程序可以减少我们的工作量。
  • 从不同来源(主要来自 Excel 电子表格)插入批量记录的最佳方法是什么?

sql-server bulk import

8
推荐指数
3
解决办法
974
查看次数

如何判断我的 SQL Server 数据库性能是否受硬件限制?

测试当前在单用户负载下的应用程序 - 随着测试数据增加到生产大小(每个表 400k-2M 行),一些 SELECT sp 的速度不再足够快(测试数据有限,每个过去 <30 毫秒,现在是 100-200 毫秒,但有几个,所以延迟在 UI 中变得明显)。

performance sql-server sql-server-2000

8
推荐指数
2
解决办法
1418
查看次数

对于在线游戏(几千名玩家)来说,哪种 DBMS 足够快?

我目前正在制作一款 MMORPG 游戏,它可能有几千名玩家同时在线(可能不是;只是一厢情愿)。首先我们想使用 MySQL,但我听说它对于这种规模还不够快。

哪个 DBMS 足够快?它有多像 SQL Server(我在学校学过 SQL Server)?

mysql rdbms database-design sql-server scalability

8
推荐指数
5
解决办法
4495
查看次数

SSMS 中的 SQLCMD 模式和@@variable 扩展

在 SSMS 中使用 SQLCMD 模式时(不是从命令行),有没有办法将当前服务器和实例分配给变量?这不同于分配普通的 TSQL 变量。

问题定义

我想使用 SQLCMD 变量扩展的强大功能来替换部署脚本中特定于环境的值,而不是我已经进入的现有 tsql 字符串构建混搭。除了当前环境的一个例外,使用 SQLCMD 处理部署的进展非常顺利。

--
-- define 2 sqlcmd variables that will be expanded in scripts
--
:setvar dbServer "DEVA2\DEV2"
:setvar dbNotServer @@servername

SELECT
    '$(dbServer)' AS hard_coded_value
,   @@servername AS [servername]
,   '$(dbNotServer)' AS dbNotServer
Run Code Online (Sandbox Code Playgroud)

这会产生以下结果。

hard_coded_value  servername  dbNotServer
DEVA2\DEV2        DEVA2\DEV2  @@servername
Run Code Online (Sandbox Code Playgroud)

肉饼说3分之2 还不错,但我宁愿有 3 分之 3 的解决方案。当该脚本部署到测试服务器时,我不想相信部署人员会编辑脚本。

如果使用 SQLCMD 的唯一解决方案是完全从命令行调用脚本,我可以接受这一点,但我想把它扔在这里,因为我对使用 SQLCMD 不感兴趣。

期望输出

:setvar dbNotServer @@servername
SELECT '$(dbNotServer)' AS worked
Run Code Online (Sandbox Code Playgroud)

结果

worked
DEVA\DEV2
Run Code Online (Sandbox Code Playgroud)

徒劳的追求 …

sql-server-2005 sql-server-2008 sql-server

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

如何在选择(SQL Server)中使用变量?

如果我想计算一列并在多于 1 列中使用结果,如何在不进行两次计算的情况下执行此操作?

例子:

SELECT LOWER(SUBSTRING([NAME], 4, 100)) + '@somedomain.com' as EMail
      ,hashbytes('SHA1', LOWER(SUBSTRING([NAME], 4, 100)) + '@somedomain.com') as HashedEmail
FROM sometable
Run Code Online (Sandbox Code Playgroud)

如何避免在不使用多个选择的情况下写两次?

sql-server select

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

明智地使用触发器来更新另一个表?

我有一个Object表,它是从另一个数据库的集成服务(如果需要,我可以更改)填充的。在某些时候,我们需要在另一个表中手动添加帖子,ObjectObjectGroup (ObjectId, ObjectGroupId)如果Object.ObjectType有某个整数值,则需要该表。由于集成服务不处理这种更新,我正在考虑向 Object 表添加一个触发器,其伪代码如下:

if Object.ObjectType = 10
    begin
        if Object.ObjectNumber like '<string pattern>'
        begin
            insert into ObjectObjectGroup values...
        end
    end
Run Code Online (Sandbox Code Playgroud)

这种设置是明智的,还是在性能方面有更好的方法?

trigger sql-server

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