当前位置: 首页 > 面试题库 >

是否可以告诉SSMS不要检查t-sql脚本中是否存在列?

申宜
2023-03-14
问题内容

我试图用谷歌搜索,但找不到方法

我有一个t-sql脚本,该脚本将新列添加到表中,然后根据该表中其他列的值填充该列,最后删除一些列。这一切都很好。

当我想再次运行脚本时,会出现问题。我有一个if子句,用于检查缺少的列是否存在,但是即使if子句中的代码未运行,SSMS仍会抱怨并显示错误消息。该脚本必须能够再运行一次,并且我不希望显示错误消息!

在代码中(显然是测试代码,不想在此处转储生产代码…):

create table test (
 Name text,
 Switch int,
 ValueA int,
 ValueB int)
go

insert into test values ('Name', 0, 5, 10)

if not exists (select 1 from INFORMATION_SCHEMA.COLUMNS
      where COLUMN_NAME = 'ValueC' and TABLE_NAME = 'test')
begin
 alter table test
 add ValueC int
end
go

-- This batch rasies error when run more then once!
if exists (select 1 from INFORMATION_SCHEMA.COLUMNS
     where COLUMN_NAME = 'ValueA' and TABLE_NAME = 'test')
begin
 update test
 set ValueC = (select case Switch
      when 0 then (select (ValueA - ValueB))
      when 1 then (select (ValueB - ValueA))
     end)
end
go

if exists (select 1 from INFORMATION_SCHEMA.COLUMNS
     where COLUMN_NAME = 'ValueA' and TABLE_NAME = 'test')
begin
 alter table test drop column ValueA
end
go

select * from test
--Name 0 10 -5

这是错误消息

Msg 207, Level 16, State 1, Line 6
Invalid column name 'ValueA'.
Msg 207, Level 16, State 1, Line 7
Invalid column name 'ValueA'.

干杯-乔克


问题答案:

是的,没有动态SQL是可能的,但是有一些麻烦的解决方法。我只会用EXEC这个。

此处说明了SQL 2000中的行为

Erland Sommarskog提到“一旦查询中的所有表都存在,SQL Server会对查询执行完全检查。”

因此,通过在查询中向不存在的表添加无操作引用,可以推迟编译。通过此调整,下面的脚本可以多次运行而不会出现错误。

insert into test values ('Name', 0, 5, 10)

if not exists (select 1 from INFORMATION_SCHEMA.COLUMNS
      where COLUMN_NAME = 'ValueC' and TABLE_NAME = 'test')
begin
 alter table test
 add ValueC int
end
go

create table #dummy
(i int)

-- This batch raised error when run more then once!
if exists (select 1 from INFORMATION_SCHEMA.COLUMNS
     where COLUMN_NAME = 'ValueA' and TABLE_NAME = 'test')
begin
 update test
 set ValueC = (select case Switch
      when 0 then (select (ValueA - ValueB))
      when 1 then (select (ValueB - ValueA))
     end) where not exists(select * from #dummy)
end

drop table #dummy
go


if exists (select 1 from INFORMATION_SCHEMA.COLUMNS
     where COLUMN_NAME = 'ValueA' and TABLE_NAME = 'test')
begin
 alter table test drop column ValueA
end



go


select * from test
--Name 0 10 -5


 类似资料:
  • 我有一个相当大的bean(~100个属性),映射到几个较小的对象中。可能会出现这样的情况:较小的目标对象的属性与我的源bean中的名称相同,但语义不同。 我希望MapSTRt在这个特定的情况下只映射我使用注释显式告诉的内容,而不执行通常的自动映射。 MapStruct文档告诉我: 在生成的方法实现中,源类型(…)的所有可读属性将被复制到目标类型(…)中的相应属性中。 我没有找到任何配置选项来关闭此

  • 如果表已经存在,如何检查TarantoolSQL?

  • 问题内容: 如何检查python脚本中是否存在程序? 假设您要检查或是否可用。我们假设他们应该在路上。 最好看到一个多平台解决方案,但就目前而言,Linux足够了。 提示: 运行命令并检查返回代码并不总是足够的,因为某些工具即使尝试也会返回非0结果。 检查命令时,屏幕上不应显示任何内容 另外,我希望能找到更通用的解决方案,例如 问题答案: import subprocess import os

  • 问题内容: 有没有一种方法可以检查nodestore的firestore中是否存在子集合? 目前,我正在使用文档,但是我需要检查文档中是否存在子类以便写入一些数据。 问题答案: 就在这里。您可以使用docs.length来知道子集合是否存在。 我制作了一个样本来指导您,希望对您有所帮助。

  • 问题内容: 我希望这是关于如何使用SQL语句检查SQL Server 2000/2005中是否存在表的最终讨论。 当您用Google搜索答案时,会得到很多不同的答案。有官方/后向和向前兼容的方式吗? 这是两种可能的方法。两种方法中的哪一种是标准/最佳方法? 第一种方式: 第二种方式: MySQL提供的简单 陈述。我正在寻找类似的东西。 问题答案: 对于此类查询,最好始终使用INFORMATION_

  • 我需要检查一列是否存在,如果不存在,请添加它。根据我的研究,sqlite似乎不支持是否应该使用语句和case语句。 以下是我目前掌握的情况: 但我得到了一个错误:接近“ALTER”:语法错误。 有什么想法吗?