小编Sha*_*tor的帖子

为什么我的更新语句会更新每一行?

问题:

由于语法和回滚事务,我的最终更新语句应该出错,预期的错误应该类似于:

消息 207,级别 16,状态 1,第 45 行无效的列名称“FakeTest1”

我很好奇当允许执行引用不存在的列的子查询时,为什么 SQL Server 更新列中的每一行。

背景

我正在创建一个包含两列的临时表,FakeID并且FakeVarchar.

 SELECT  [FakeID], [FakeVarchar]
 INTO [#T]
 FROM [CTE];
Run Code Online (Sandbox Code Playgroud)

当我的UPDATE语句使用此WHERE子句在 中指定列 [ID] 时SELECT SUBQUERY,它会更新整个表,而不是在解析命令时出错。

WHERE [FakeTableDestination].[ID] IN
(
    SELECT [ID]
    FROM [#T]
);
Run Code Online (Sandbox Code Playgroud)

应该在子查询中以使其正确运行的列将是FakeID. 此语句显然有效,并且按预期更新。

WHERE [FakeTableDestination].[ID] IN
(
    SELECT [FakeID]
    FROM [#T]
);
Run Code Online (Sandbox Code Playgroud)

当我用任何其他列名替换 FakeID / ID 时,它会按预期失败。

WHERE [FakeTableDestination].[ID] IN
(
    SELECT [NotActuallyAColumnInThisTableEither]
    FROM [#T]
);
Run Code Online (Sandbox Code Playgroud)

完整的 SQL 代码,当它应该出错时更新整个表

IF OBJECT_ID('dbo.FakeTableSource', 'U') IS NOT …
Run Code Online (Sandbox Code Playgroud)

sql-server update

8
推荐指数
0
解决办法
206
查看次数

如何重写此存储过程以不使用游标?

我想更改我的存储过程,使其不再使用游标来运行。我怎样才能更好地编写这个存储过程?

我正在使用游标编译动态 SQL 以查询我从列表中创建的服务器,以跟踪事务日志备份历史记录。

ALTER PROC [dbo].[spLogBackup]

AS

TRUNCATE TABLE dbo.tLogBackup

DECLARE servers_cursor CURSOR
FOR
select  distinct LinkedserverName
from dbo.Environment
join master..sysservers on srvname COLLATE DATABASE_DEFAULT  = LinkedserverName COLLATE DATABASE_DEFAULT
where LinkedServerName not in ('TestDB')

and ServerUse in ('PROD', 'DR')
and IncludeInstats = 1
order by LinkedServerName

OPEN servers_cursor
DECLARE @Servername varchar(250)

DECLARE @sql varchar(8000)

FETCH NEXT FROM servers_cursor INTO @ServerName
WHILE (@@FETCH_STATUS = 0)
BEGIN
    --Looping throught the servers.
    set @sql = 'insert into dbo.tLogBackup (servername, rundate, runtime, jobname, …
Run Code Online (Sandbox Code Playgroud)

sql-server stored-procedures t-sql

-1
推荐指数
1
解决办法
173
查看次数

标签 统计

sql-server ×2

stored-procedures ×1

t-sql ×1

update ×1