由于语法和回滚事务,我的最终更新语句应该出错,预期的错误应该类似于:
消息 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)
IF OBJECT_ID('dbo.FakeTableSource', 'U') IS NOT …Run Code Online (Sandbox Code Playgroud) 我想更改我的存储过程,使其不再使用游标来运行。我怎样才能更好地编写这个存储过程?
我正在使用游标编译动态 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)