SQL server 判断表中是否有字段

由于不能保证所有环境中的 kuout 表都包含 [Mtype] 字段,我们需要动态判断该字段是否存在 ,如果存在就包含它,否则用 NULL 或默认值代替。


✅ 推荐解决方案:使用动态 SQL + 信息架构(INFORMATION_SCHEMA)

你可以修改你的 SQL 脚本,在构建 @Sql44 之前,先检查 @DatabaseName.dbo.kuout 是否包含 [Mtype] 字段,然后动态生成 SELECT 列表。

复制代码
BEGIN TRY

	    DECLARE @HasMtype BIT = 0
		DECLARE @CheckSql NVARCHAR(MAX)

		-- 构建动态 SQL 检查字段是否存在
		SET @CheckSql = N'
			IF EXISTS (
				SELECT 1 
				FROM ' + QUOTENAME(@DatabaseName) + N'.INFORMATION_SCHEMA.COLUMNS 
				WHERE TABLE_SCHEMA = N''dbo'' 
				  AND TABLE_NAME = N''kuout'' 
				  AND COLUMN_NAME = N''Mtype''
			)
			BEGIN
				SET @HasMtypeOUT = 1
			END
			ELSE
			BEGIN
				SET @HasMtypeOUT = 0
			END
		'

		-- 执行动态 SQL 并获取输出参数
		EXEC sp_executesql 
			@CheckSql, 
			N'@HasMtypeOUT BIT OUTPUT', 
			@HasMtypeOUT = @HasMtype OUTPUT  

        DECLARE @Sql44 NVARCHAR(MAX)
		IF @HasMtype = 1
			SET @Sql44 = N'
			INSERT INTO dbo.ods_kuout_ext ([ord],[title],[ckbh],[ck],[date3],[date5],[intro],[complete1],[fh1],[order1],[intro2],[cateid],[cateid2],[cateid3],[del],[cateout],[delcate],[deldate],[date7],[kg],[kgs],[sort1],[IsMinusKuout],[zdy1],[zdy2],[zdy3],[zdy4],[zdy5],[zdy6],[source],[fromid],[status],[QualityType],[QualityUsers],[FactQualityUsers],[QualityResult],[QualityDate],[AddQualityDate],[AddQualityUser],[QualityRemark],[ModifyStamp],[alt],[receiver],[phone],[mobile],[address],[zip],[areaId],[kuout],[IsHC],[IsWeight],[CarNum],[IsTempSave],[Mtype],[dt])
            SELECT [ord]
			,[title]
			,[ckbh]
			,[ck]
			,[date3]
			,[date5]
			,[intro]
			,[complete1]
			,[fh1]
			,[order1]
			,[intro2]
			,[cateid]
			,[cateid2]
			,[cateid3]
			,[del]
			,[cateout]
			,[delcate]
			,[deldate]
			,[date7]
			,[kg]
			,[kgs]
			,[sort1]
			,[IsMinusKuout]
			,[zdy1]
			,[zdy2]
			,[zdy3]
			,[zdy4]
			,[zdy5]
			,[zdy6]
			,[source]
			,[fromid]
			,[status]
			,[QualityType]
			,[QualityUsers]
			,[FactQualityUsers]
			,[QualityResult]
			,[QualityDate]
			,[AddQualityDate]
			,[AddQualityUser]
			,[QualityRemark]
			,[ModifyStamp]
			,[alt]
			,[receiver]
			,[phone]
			,[mobile]
			,[address]
			,[zip]
			,[areaId]
			,[kuout]
			,[IsHC]
			,[IsWeight]
			,[CarNum]
			,[IsTempSave]
			,[Mtype]
			,' + QUOTENAME(CONVERT(NVARCHAR(10), @DateThreshold, 120), '''') + N'as dt FROM' + QUOTENAME(@DatabaseName) + N'.[dbo].[kuout]'
		ELSE
			SET @Sql44 = N'
			INSERT INTO dbo.ods_kuout_ext ([ord],[title],[ckbh],[ck],[date3],[date5],[intro],[complete1],[fh1],[order1],[intro2],[cateid],[cateid2],[cateid3],[del],[cateout],[delcate],[deldate],[date7],[kg],[kgs],[sort1],[IsMinusKuout],[zdy1],[zdy2],[zdy3],[zdy4],[zdy5],[zdy6],[source],[fromid],[status],[QualityType],[QualityUsers],[FactQualityUsers],[QualityResult],[QualityDate],[AddQualityDate],[AddQualityUser],[QualityRemark],[ModifyStamp],[alt],[receiver],[phone],[mobile],[address],[zip],[areaId],[kuout],[IsHC],[IsWeight],[CarNum],[IsTempSave],[dt])
            SELECT [ord]
			,[title]
			,[ckbh]
			,[ck]
			,[date3]
			,[date5]
			,[intro]
			,[complete1]
			,[fh1]
			,[order1]
			,[intro2]
			,[cateid]
			,[cateid2]
			,[cateid3]
			,[del]
			,[cateout]
			,[delcate]
			,[deldate]
			,[date7]
			,[kg]
			,[kgs]
			,[sort1]
			,[IsMinusKuout]
			,[zdy1]
			,[zdy2]
			,[zdy3]
			,[zdy4]
			,[zdy5]
			,[zdy6]
			,[source]
			,[fromid]
			,[status]
			,[QualityType]
			,[QualityUsers]
			,[FactQualityUsers]
			,[QualityResult]
			,[QualityDate]
			,[AddQualityDate]
			,[AddQualityUser]
			,[QualityRemark]
			,[ModifyStamp]
			,[alt]
			,[receiver]
			,[phone]
			,[mobile]
			,[address]
			,[zip]
			,[areaId]
			,[kuout]
			,[IsHC]
			,[IsWeight]
			,[CarNum]
			,[IsTempSave]
			,' + QUOTENAME(CONVERT(NVARCHAR(10), @DateThreshold, 120), '''') + N'as dt FROM' + QUOTENAME(@DatabaseName) + N'.[dbo].[kuout]'
        

		SET @Sql44 = REPLACE(@Sql44, '@DateThreshold', @DateThreshold)
		EXEC sp_executesql @Sql44

    END TRY


    BEGIN CATCH

        DECLARE @ErrorMessage44 NVARCHAR(4000)
        SET @ErrorMessage44 = ERROR_MESSAGE()

        RAISERROR (@ErrorMessage44, 16, 1)

    END CATCH
相关推荐
松涛和鸣1 天前
DAY67 IMX6 Development Board Configuration from Scratch
数据库·postgresql·sqlserver
wangqiaowq1 天前
SQL server 的3种数据库连接协议
sqlserver
山岚的运维笔记2 天前
SQL Server笔记 -- 第13章:IF...ELSE
数据库·笔记·sql·microsoft·sqlserver
woshilys5 天前
sql server 表被另外一张表锁
sqlserver
zhangzeyuaaa6 天前
SQL Server删除重复数据
运维·sqlserver
雪碧聊技术8 天前
DBeaver连接sql server数据库时,提示驱动版本不合适
数据库·sqlserver·dbeaver·更换驱动·修改java.security
雷工笔记9 天前
数据库|SQLServer2025安装教程
数据库·sqlserver
梁正雄11 天前
linux服务-麒麟10安装sqlserver
linux·运维·sqlserver
齐 飞11 天前
SQL server使用MybatisPlus查询SQL加上WITH (NOLOCK)
数据库·mysql·sqlserver