小编iri*_*ias的帖子

在 SQL 中使用替换

我有一张桌子,我需要更新一些名字,但我想知道

以下查询:

两者都会这样做吗?

查询1

Update mytable
Set Name = Replace(Name,'Jeff','Joe')
Run Code Online (Sandbox Code Playgroud)

查询2

Update mytable
Set Name = 'Joe'
where Name = 'Jeff'
Run Code Online (Sandbox Code Playgroud)

sql-server

13
推荐指数
2
解决办法
1093
查看次数

SQLServer 升级顾问 2014 挂起

我尝试针对 SQL Server 2008 服务器运行 SQL Server Upgrade Advisor 2014。

连接到 2008 服务器时一切正常,我可以选择要分析的数据库。

在此处输入图片说明

但是一旦启动,它就会永远运行,什么也不做(停留在分析规则:0/112步骤)。

在此处输入图片说明

发生了什么,我该如何解决?

SQL Server 2008 和 2014 都是 Express 版本并安装在我的笔记本电脑上。不幸的是,这是我发现运行升级顾问的唯一方法(在真正的生产/开发数据库上运行它有太多限制)。

SQL 2008 实例根据需要使用 SP3 。

Microsoft SQL Server 2008 (SP3) - 10.0.5500.0 (X64)   Sep 21 2011 22:45:45   Copyright (c) 1988-2008 Microsoft Corporation  Express Edition (64-bit) on Windows NT 6.2 <X64> (Build 9200: ) 
Run Code Online (Sandbox Code Playgroud)

当 Advisor 被冻结时,我们可以看到 4 个休眠查询(没有活动查询):

SELECT name,
       cmptlevel
FROM
  (SELECT name,
          dbid,
          cmptlevel,
          DATABASEPROPERTYEX(name, N'UserAccess') AS 'UserAccess',
          DATABASEPROPERTYEX(name, …
Run Code Online (Sandbox Code Playgroud)

sql-server-2008 sql-server upgrade sql-server-2014

11
推荐指数
1
解决办法
447
查看次数

防止动态 SQL 中的 SQL 注入

让我们想象一个存储过程,它检索数据并进行某种分页。这个过程有一些输入,描述了我们想要的数据集以及我们如何对其进行排序。

这是一个非常简单的查询,但让我们以它为例。

create table Persons(id int, firstName varchar(50), lastName varchar(50))
go
create procedure GetPersons @pageNumber int = 1, @pageSize int = 20, @orderBy varchar(50) = 'id', @orderDir varchar(4) = 'desc'
as

declare @sql varchar(max)
set @sql = 'select id, firstName, lastName
from (
    select id, firstName, LastName, row_number() over(order by '+@orderBy+' '+@orderDir+') as rn
    from Persons
    ) t
where rn > ('+cast(@pageNumber as varchar)+'-1) * '+cast(@pageSize as varchar)+'
        and rn <= '+cast(@pageNumber as varchar)+' * '+cast(@pageSize as varchar)+' 
order by …
Run Code Online (Sandbox Code Playgroud)

security sql-server

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

如果存储过程在 TRY / CATCH 中失败,则未设置输出参数

在 SQL Server 2008 中(但也在 2014 年)。让我们考虑一个具有输出参数的过程。此过程可能会产生错误(并且会在以下示例中产生)。我注意到如果我们在TRY/CATCH块中调用过程,输出参数的行为是不一样的。

例子:

create procedure test_output @result varchar(10) output
as
begin
    set @result = 'hello'
    raiserror('This is an error', 16,1)
    set @result = 'error'
end
Run Code Online (Sandbox Code Playgroud)

如果我们以简单的方式启动程序:

declare @res1 varchar(10)
exec test_output @result = @res1 out
print 'Result is: '+ isnull(@res1, 'empty')
Run Code Online (Sandbox Code Playgroud)

我们得到(我很好):

Msg 50000, Level 16, State 1, Procedure test_output, Line 7 [Batch Start Line 12]
这是一个错误
结果是:错误

如果过程现在在 try/catch 块中:

declare @res2 varchar(10)
declare @error_message varchar(max)
begin try
    exec test_output …
Run Code Online (Sandbox Code Playgroud)

sql-server t-sql parameter error-handling

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

当 value 为 null 时,对 WHERE 语句中变量的行为感到困惑

我有一个像(SQLServer 2008)的表:

CREATE TABLE [dbo].[my_test_table](
    [productId] [int] NOT NULL,
    [purchaseId] [bigint] NOT NULL,
    (some other columns....),
 CONSTRAINT [PK_my_test_table] PRIMARY KEY CLUSTERED 
(
    [productId] ASC,
    [purchaseId] ASC
))
Run Code Online (Sandbox Code Playgroud)

大约有 1000 万行。

我想要一个查询,返回产品的总行数,或者如果产品未指定,则返回所有产品的总行数。就像是:

declare @productId int

set @productId = 320

select count(*)
from my_test_table t with(nolock)
where productId = @productId
or @productId is null
Run Code Online (Sandbox Code Playgroud)

问题是查询比等效查询花费时间要多得多:

select count(*)
from my_test_table t with(nolock)
where productId = 320
or 320 is null
Run Code Online (Sandbox Code Playgroud)

我们如何解释这种行为?

以下是执行计划: 在此处输入图片说明

sql-server-2008 sql-server t-sql

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