如何在运行查询之前避免语法检查?

时间:2014-06-24 18:38:10

标签: tsql

这是我的代码:

CREATE TABLE [dbo].[TestTable](
ColumnA VARCHAR(20),
ColumnB VARCHAR(20))

INSERT INTO TestTable
SELECT 'TestA', 'TestB'

IF COL_LENGTH('TestTable', 'ColumnC') IS NOT NULL
BEGIN
    PRINT 'ColumnC Present'
    SELECT ColumnC FROM TestTable
END

正如您所看到的,它应该只查询ColumnC是否实际存在。然而,mgmt studio阻止整个查询的执行。 基本上我想要的是在此列存在时查询ColumnC的值。我正在为多个版本的软件编写查询,有些版本的旧版本没有旧版本。

1 个答案:

答案 0 :(得分:1)

这不是关于如何检查列的存在。相反,这是关于表和列名称的飞行前SQL检查。

我无法弄清楚如何使IF ELSE块工作,所以我选择基于COL_LENGTH制作动态SQL语句。

这是我使用的实际解决方案。 (我的真实查询使用CTE,所以我必须确保它与CTE一起正常工作)

DECLARE @IsBroken VARCHAR(20)
SET @IsBroken = 'ColumnB'

IF COL_LENGTH('TestTable', 'ColumnC') IS NOT NULL
BEGIN
    PRINT 'ColumnC Present'
    SET @IsBroken = 'ColumnC'
END

DECLARE @SQLStatement VARCHAR(MAX)
SET @SQLStatement = '
;WITH UpdateTypes AS
(
    SELECT ' + @IsBroken + ' FROM TestTable
)
SELECT * FROM UpdateTypes'
PRINT @SQLStatement
EXEC (@SQLStatement)