SQL插入取决于列是不是存在
Posted
技术标签:
【中文标题】SQL插入取决于列是不是存在【英文标题】:SQL Insert depending if a column existsSQL插入取决于列是否存在 【发布时间】:2013-08-23 14:03:00 【问题描述】:由于同一个表的不同版本,我需要执行一个 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
有什么解决方法吗?
【问题讨论】:
你从哪里得到你的价值观?是不是一些参数,比如@value1...? @framara 奇怪的案例我尝试使用相同的代码但它的工作,但是你可以先检查列是否存在而不是列长度。 【参考方案1】: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)
【讨论】:
我终于使用了 EXEX('INSERT... ') 和转义单引号。谢谢! 小心 SQL 注入。【参考方案2】:我会创建具有公共签名的存储过程,而不是动态处理此问题,并将适当的版本添加到您的各种版本的数据库中
例如:
create proc TableAInsert
(
@col1 int,
@col2 int,
@col3 int,
@col4 int
)
以这种方式,您可以为您的数据库创建一个interface
定义。
如果你的数据库再次发生变化,你可以创建一个新版本的这个过程,带有一个带有默认值的可选参数,并像以前一样继续调用它。
【讨论】:
【参考方案3】:使用 INFORMATION_SCHEMA.COLUMNS
检查 TableA 的 Column2 是否存在,并在原始查询中使用它在 2 个插入之间切换
【讨论】:
【参考方案4】: 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
的检查中没有发现任何问题。
-希望对您有所帮助。
【讨论】:
以上是关于SQL插入取决于列是不是存在的主要内容,如果未能解决你的问题,请参考以下文章