SQL Insert depending if a column exists
我需要进行一次或另一次插入,这取决于同一个表的不同版本是否存在列。
我在这个线程上使用了这种方法,但SQL Server的预检查或"排序编译"检测到一个错误,该错误在执行期间不会失败。
这是一些密码
1 2 3 4 5 6 7 8 9 10 11 12 13 | 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 |
有什么解决办法吗?
SQL将知道该列不存在,因此它不会让您运行查询。解决方案是执行动态查询。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 | 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 2 3 4 5 6 7 | CREATE proc TableAInsert ( @col1 INT, @col2 INT, @col3 INT, @col4 INT ) |
号
以这种方式,您可以为数据库创建一个
如果数据库再次更改,则可以使用带有默认值的可选参数创建此过程的新版本,并以与以前相同的方式继续调用它。
使用
1 2 3 4 5 6 7 | 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 |
首先检查列是否存在,然后检查其长度。不过,我认为
-希望有帮助。