我需要执行一个INSERT或另一个,具体取决于是否存在列,因为同一个表的版本不同。
我在this thread处理了该方法,但SQL Server的预检或“排序编译”检测到在执行期间不会失败的错误。
这是一些代码
IF COL_LENGTH('TableA', 'Column2') IS NOT NULL
BEGIN
INSERT INTO [dbo].[TableA]([Column1], [Column2], [Column3], [Column4])
SELECT value1, value2, value3, value4
END ELSE
BEGIN
INSERT INTO [dbo].[TableA]([Column1], [Column3], [Column4])
SELECT value1, value3, value4
END
任何解决方法?
答案 0 :(得分:10)
SQL将知道该列不存在,因此它不允许您运行查询。解决方案是执行动态查询。
DECLARE @value1 AS VARCHAR(50)
DECLARE @value2 AS VARCHAR(50)
DECLARE @value3 AS VARCHAR(50)
DECLARE @value4 AS VARCHAR(50)
SET @value1 = 'somevalue1'
SET @value2 = 'somevalue2'
SET @value3 = 'somevalue3'
SET @value4 = 'somevalue4'
DECLARE @SQL AS VARCHAR(MAX)
IF COL_LENGTH('TableA', 'Column2') IS NOT NULL
BEGIN
SET @SQL =
'INSERT INTO [dbo].[TableA]([Column1], [Column2], [Column3], [Column4])
SELECT ' + @value1 + ', ' + @value2 + ', ' + @value3 + ', ' + @value4
END
ELSE
BEGIN
SET @SQL =
'INSERT INTO [dbo].[TableA]([Column1], [Column3], [Column4])
SELECT ' + @value1 + ', ' + @value3 + ', ' + @value4
END
EXEC(@SQL)
答案 1 :(得分:4)
我不是动态地接近它,而是使用公共签名创建存储过程,并将适当的版本添加到您的各种版本的数据库中
例如:
create proc TableAInsert
(
@col1 int,
@col2 int,
@col3 int,
@col4 int
)
以这种方式,您可以为数据库创建interface
定义。
如果您的数据库再次更改,您可以使用带有默认值的可选参数创建此过程的新版本,并继续以与以前相同的方式调用它。
答案 2 :(得分:2)
使用INFORMATION_SCHEMA.COLUMNS
检查TableA的Column2是否存在,并在原始查询中使用它来在2个插入之间切换
答案 3 :(得分:0)
IF NOT EXISTS(SELECT * FROM INFORMATION_SCHEMA.COLUMNS
WHERE TABLE_NAME = 'TABLEA' AND COLUMN_NAME = 'COLUMNNAME')
BEGIN
IF COL_LENGTH('TableA', 'Column2') IS NOT NULL
BEGIN
INSERT INTO [dbo].[TableA]([Column1], [Column2], [Column3], [Column4])
SELECT value1, value2, value3, value4
首先检查列是否存在,然后检查其长度。
但是我在COL_LENGTH
检查时看不到任何错误。
- 希望它有所帮助。