我有一张桌子,我需要更新一些名字,但我想知道
以下查询:
两者都会这样做吗?
查询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 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) 让我们想象一个存储过程,它检索数据并进行某种分页。这个过程有一些输入,描述了我们想要的数据集以及我们如何对其进行排序。
这是一个非常简单的查询,但让我们以它为例。
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) 在 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) 我有一个像(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)
我们如何解释这种行为?