从msdn:
与派生表不同,CTE 可以是自引用的,并且可以在同一个查询中多次引用。
我经常使用 CTE,但我从未深入思考使用它们的好处。
如果我在同一个查询中多次引用 CTE:
我正在使用 SQL Server 2008 R2 并且我有这个伪查询 (SP):
select ...
from ...
WHERE @LinkMode IS NULL
AND (myColumn IN (...very long-running query...))
...
...
Run Code Online (Sandbox Code Playgroud)
问题是查询需要很长时间才能执行——即使我使用@LinkMode=2.
正如您所注意到的,只有当 @LinkMode 为 null 时才应该执行长时间运行的查询,而这里不是这种情况。在我的情况下 @LinkMode = 2 !
但是,如果我将其更改为:
select ...
from ...
WHERE 1=2
AND (myColumn IN (...very long time exeted query...))
...
...
Run Code Online (Sandbox Code Playgroud)
SP确实跑得很快。
我以前听说有时优化器可以优化标准的顺序。
所以我问:
即使优化器选择了不同的路由,还有什么比检查 if 更快=null?我的意思是,我认为检查if a==null是多比正在运行的其他长的查询速度更快...
如何强制SQL Server 按照我编写的方式运行查询(相同的顺序)?
有人告诉我,如果攻击者可以访问未加密的 .bak 文件,他们就可以访问数据。
所以让我们看看这个场景:
OPEN SYMMETRIC KEY MySymetricKey DECRYPTION
BY CERTIFICATE MyCertificate
Run Code Online (Sandbox Code Playgroud)
注意 - 这里没有密码。
然后我们通过以下方式加密我们的表:
UPDATE tbl1
SET namePAss = ENCRYPTBYKEY(KEY_GUID('MySymetricKey'),name)
GO
Run Code Online (Sandbox Code Playgroud)
现在假设黑客得到了我的bak文件。为了查看数据(在他自己的计算机和 sql-server 中),他所要做的就是:
SELECT
convert( NVARCHAR(max), decryptbykey(namePAss))
FROM tbl1
Run Code Online (Sandbox Code Playgroud)
他还能访问数据吗?
(问题移自 SO)
我有一个带有聚集索引的表(虚拟数据)包含 2 列:
现在我运行这两个查询:
declare
@productid int =1 ,
@priceid int = 1
SELECT productid,
t.priceID
FROM Transactions AS t
WHERE (productID = @productid OR @productid IS NULL)
AND (priceid = @priceid OR @priceid IS NULL)
SELECT productid,
t.priceID
FROM Transactions AS t
WHERE (productID = @productid)
AND (priceid = @priceid)
Run Code Online (Sandbox Code Playgroud)
两个查询的实际执行计划是:
如您所见,第一个使用 SCAN,而第二个使用 SEEK。
但是 - 添加OPTION (RECOMPILE)到第一个查询,使执行计划也使用 SEEK:
DBA 聊天室的朋友告诉我:
在您的查询中,@productid=1,这意味着(productID=@productID OR @productID IS NULL)可以简化为(productID=@productID)。前者需要扫描才能使用@productID 的任何值,后者可以使用搜索。因此,当您使用 RECOMPILE 时,SQL Server 将查看您在 @productID 中实际拥有的值并为其制定最佳计划。在@productID 中使用非空值时,最好使用查找。如果@productID 的值未知,则计划必须适合@productID …
我有一张Images表,该表包含这些基本列 —
ImageId (int)
VotesUp (int)
VotesDown (int)
Run Code Online (Sandbox Code Playgroud)
每张图片都可以得到赞成票(向上、向下、收回投票)
upvotes 表有:
ImageId (int)
UserId (int)
Score (int ) [-1,0,+1]
Run Code Online (Sandbox Code Playgroud)
因此,如果 -
用户插入 +1 分数然后(如果不存在)我向upvotes表中添加一个新行并更新表中的值Images(用于快速获取)
用户将其分数从 +1 更改为 0,然后降低 votes up
votes up和增加
votes downvotes up 用户将其分数从 0 更改为 -1,然后增加 votes down
用户将其分数从 -1 更改为 0 然后降低 votes down
votes down 和增加votes up这是一个非常简单的逻辑。
这是upvotes桌子上的触发器:
alter TRIGGER [dbo].[UpvotesChanged] …Run Code Online (Sandbox Code Playgroud) 我在 Microsoft SQL Server 中有一个表。有时需要更新,有时需要插入。我可以写2个存储过程:
InsertNewPerson
UpdatePertsonById
Run Code Online (Sandbox Code Playgroud)
但我正在考虑编写 1 个存储过程而不是 ( SetPerson),这两个过程都可以(如果有ID,则是update操作,否则insert)。
我应该创建一个存储过程(只需要维护一个)还是应该创建两个不同的存储过程?
sql-server-2008 sql-server stored-procedures physical-design upsert
如果我在 SQL Server 中编写:
SELECT number FROM master..spt_values WHERE Type = 'P' ORDER BY Number
Run Code Online (Sandbox Code Playgroud)
我得到了一个我已经可以使用的序列号列表,而不是用序列号写一个表格。
这对于小连接、行编号等非常有帮助。
我想知道是否还有其他像这样的隐藏表也可以帮助我做其他事情?例如,我可能想要select someNonImportantTextColmn from master..unknown并应用我的功能。
我在哪里可以找到这些“帮助表”的完整列表?
问完这个我还有一个问题。
公司需要存储敏感数据。请我们现在不要谈论证书。
一个DBA执行以下操作:
CREATE SYMMETRIC KEY SecureSymmetricKey1
WITH ALGORITHM = DESX
ENCRYPTION BY PASSWORD = N'blabla';
Run Code Online (Sandbox Code Playgroud)
一个程序员想要加密数据并执行以下操作:
-- open key
OPEN SYMMETRIC KEY SecureSymmetricKey1
DECRYPTION BY PASSWORD = N'blabla'
-- actual encrpyt
DECLARE @encrypted_str VARBINARY(MAX)
SET @encrypted_str = EncryptByKey(Key_GUID('SecureSymmetricKey1'),'my data');
Run Code Online (Sandbox Code Playgroud)
另一个程序员想要读取数据,所以他这样做:
DECLARE @decrypted_str VARBINARY(MAX)
SET @decrypted_str = DecryptByKey(...encrypted_str...)
Run Code Online (Sandbox Code Playgroud)
一切都很好。
问题 :
当程序员打开对称密钥时,他必须知道密码。我不认为程序员应该知道密码。如何解决?
如果一个 GOD 黑客得到了整个.BAK文件并将备份恢复到他自己的机器上 - 他可以查看其中一个程序员编写的存储过程源,并查看密码。然后黑客可以做:
开放对称密钥 SecureSymmetricKey1 密码解密 = N'blabla'
我错过了什么?
谢谢你的帮助。
看着
update MyTable
set Status = 1
where Status = 0
Run Code Online (Sandbox Code Playgroud)
当然 -where在实际更新之前计算。
但是这个过滤(where Status = 0)也在锁里面吗?
我的意思是锁在哪里?
这里 : update ...
或在这里: filter and update...
我不明白:
我已经安装了 sql server 2008 R2。安装过程要求我提供所需的实例名称,所以我写道:MSSQLSERVER。
安装后,运行Setup Discovery Report确实会显示实例名称:

我还安装了所有的服务包。
此外,所有服务都已启动:

此外,所有端口都已打开(tcp:1433 + udp:1434)


此外,命名管道开启: 
那么,问题出在哪里呢?
我无法通过实例名称连接:

也无法使用:
user\MSSQLSERVERuser计算机名在哪里。
也无法使用: .\MSSQLSERVER
但是(奇怪):
这 3 个确实有效:
user (“用户”是我的机器名)(local).题 :
为什么我不能使用我的实例名称连接到我的 sql 服务器?
相关信息:
通过 3 个工作人员之一连接后,我运行了一个有用的信息:

sql-server ×8
security ×2
connectivity ×1
cte ×1
index ×1
locking ×1
optimization ×1
trigger ×1
upsert ×1
windows-8 ×1