我有一个参数为 NULL 作为默认值的 SP,然后我想做这样的查询:
SELECT ...
FROM ...
WHERE a.Blah = @Blah AND (a.VersionId = @VersionId OR (@VersionId IS NULL AND a.VersionId IS NULL));
Run Code Online (Sandbox Code Playgroud)
在WHERE上述检查两个非空值和一个NULL值@VersionId。
在性能方面,改为使用IF语句并将查询复制到一个搜索非 NULL 的查询和另一个搜索 NULL 的查询中会不会更好?:
IF @VersionId IS NULL BEGIN
SELECT ...
FROM ...
WHERE a.Blah = @Blah AND a.VersionId IS NULL;
ELSE BEGIN
SELECT ...
FROM ...
WHERE a.Blah = @Blah AND a.VersionId = @VersionId;
END
Run Code Online (Sandbox Code Playgroud)
或者查询优化器使它本质上是一样的?
更新:
(注意:我使用的是 SQL Server)
(据我所知,a.VersionId = @VersionId这两种情况都不能使用,是吗?)
我做了以下存储过程:
ALTER PROCEDURE usp_actorBirthdays (@nameString nvarchar(100), @actorgender nvarchar(100))
AS
SELECT ActorDOB, ActorName FROM tblActor
WHERE ActorName LIKE '%' + @nameString + '%'
AND ActorGender = @actorgender
Run Code Online (Sandbox Code Playgroud)
现在,我尝试做这样的事情。也许我做错了,但我想确保这样的过程可以防止任何 SQL 注入:
EXEC usp_actorBirthdays 'Tom', 'Male; DROP TABLE tblActor'
Run Code Online (Sandbox Code Playgroud)
下图显示了在 SSMS 中执行的上述 SQL 并且结果显示正确而不是错误:
顺便说一句,我在查询完成后在分号后面添加了那部分。然后我再次执行它,但是当我检查表 tblActor 是否存在时,它仍然存在。难道我做错了什么?或者这真的是防注射的吗?我想我在这里也想问的是,这是一个像这样安全的存储过程吗?谢谢你。
sql-server-2008 security sql-server sql-injection dynamic-sql
我有一个包含 104 个触发器的数据库,有没有办法使用单个命令从名为“system_db_audits”的单个数据库中删除所有触发器?
我需要在两个系统之间转换数据。
第一个系统将日程表存储为简单的日期列表。计划中包含的每个日期都是一行。日期顺序可能存在各种差异(周末、公共假期和更长的停顿,一周中的某些日子可能会被排除在日程之外)。根本没有间隙,甚至可以包括周末。该时间表最长可达 2 年。通常它会持续数周。
这是一个简单的时间表示例,它跨越两周,不包括周末(下面的脚本中有更复杂的示例):
+----+------------+------------+---------+--------+
| ID | ContractID | dt | dowChar | dowInt |
+----+------------+------------+---------+--------+
| 10 | 1 | 2016-05-02 | Mon | 2 |
| 11 | 1 | 2016-05-03 | Tue | 3 |
| 12 | 1 | 2016-05-04 | Wed | 4 |
| 13 | 1 | 2016-05-05 | Thu | 5 |
| 14 | 1 | 2016-05-06 | Fri | 6 |
| 15 | 1 | 2016-05-09 | …Run Code Online (Sandbox Code Playgroud) 我需要创建一个模拟 TSQL 序列的存储过程。也就是说,它总是在每次调用时给出一个递增的不同整数值。此外,如果传入一个整数,如果从来没有更大的结果或可用的下一个最高整数,则它应该返回该值。不用说,可以有多个客户端同时调用此 SP。
给定一个包含 MetaKey varchar(max) 和 MeatValueLong bigInt 列的 MetaInfo 表。MetaKey 为“Internal-ID-Last”的行应该包含最后分配的最高值。我创建了以下存储过程:
CREATE PROCEDURE [dbo].[uspGetNextID]
(
@inID bigInt
)
AS
BEGIN
SET NOCOUNT ON;
BEGIN TRANSACTION
UPDATE MetaInfo WITH (ROWLOCK)
SET MetaValueLong = CASE
WHEN ISNULL(MetaValueLong,0) > @inID THEN MetaValueLong+1
ELSE @inID+1
END
WHERE MetaKey = 'Internal-ID-Last'
SELECT MetaValueLong
FROM MetaInfo
WHERE MetaKey = 'Internal-ID-Last'
COMMIT TRANSACTION
END
Run Code Online (Sandbox Code Playgroud)
我的问题很简单,这个存储过程是否按预期工作(所有调用者都将被分配一个唯一的结果)?
我认为这将是一个相当简单的问题,但实际上我很难找到答案。
问题:您能否通过简单地更新分区列使其跨越分区边界将分区表中的数据行从一个分区移动到另一个分区?
例如,如果我有一个包含分区键的表:
CREATE TABLE SampleTable
(
SampleID INT PRIMARY KEY,
SampleResults VARCHAR(100) NOT NULL,
)
Run Code Online (Sandbox Code Playgroud)
使用映射到主键的分区函数:
CREATE PARTITION FUNCTION MyPartitionFunc (INT) AS
RANGE LEFT FOR VALUES (10000, 20000);
Run Code Online (Sandbox Code Playgroud)
我可以通过将 SampleID 从 1 更改为(例如)500,000 将一行从第一个分区移动到第三个分区吗?
注意:我将其标记为 sql server 2005 和 2008,因为它们都支持分区。他们的处理方式不同吗?
我正在使用 Microsoft SQL Server 2008。我的问题是:如何在一个查询中删除多个具有公共前缀的表?
类似于那个表名:
LG_001_01_STLINE,
LG_001_02_STFICHE
Run Code Online (Sandbox Code Playgroud) 我有一个关于 SQL Server 2008 表设计的一般问题。我们目前有一个超过 600GB 的表,并且每天增长大约 3GB。此表具有适当的 indecies,但在运行查询时正成为主要问题,并且仅因为它的大小。问题是我应该按年和月将表拆分为多个表(这将适合其他部门拆分其大数据集的方式)还是我们应该利用 SQL Server 中内置的分区。使用分区似乎需要较少的代码更改。根据我在分区时阅读的内容,您仍然只查询一张表,服务器处理如何获取数据。如果我们走多表路线,我们将不得不处理从多个表中提取数据。
谁能解释为什么
select case when '' = ' ' then 1 else 0 end, LEN(''), LEN(' '), DATALENGTH(''), DATALENGTH(' ');
Run Code Online (Sandbox Code Playgroud)
产量
----------- ----------- ----------- ----------- -----------
1 0 0 0 1
Run Code Online (Sandbox Code Playgroud)
有趣的结果是,在
create table test ( val varchar(10) );
insert into test values( '' );
update test set val = ' ' where val = '';
Run Code Online (Sandbox Code Playgroud)
更新确实会用空白替换空字符串,但 where 子句保持为真,并且重复执行更新语句告诉
(1 row(s) affected)
Run Code Online (Sandbox Code Playgroud) 我在做一个需要使用 7 个数据库的新项目,认为性能、稳定性、优化更容易实现。
虽然我不同意,但我在收集使用单个数据库(将表拆分为逻辑域)的好参数时遇到了麻烦。
到目前为止,我的一个论点是数据完整性(我不能在数据库之间使用外键)。
使用单个或多个数据库的优点/缺点是什么?
[到目前为止的总结]
针对多个数据库的参数:
丢失数据完整性(不能在数据库上使用外键)
丢失恢复完整性
获得复杂性(数据库用户/角色)
小概率服务器/数据库将关闭
解决方案:
使用模式来分隔域。
POC:使用虚拟数据来证明 7/1 db 的执行计划中的要点
sql-server-2008 ×10
sql-server ×6
partitioning ×2
architecture ×1
drop-table ×1
dynamic-sql ×1
empty-string ×1
performance ×1
security ×1
trigger ×1