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
相关推荐
航Hang*18 小时前
第3章:复习篇——第1节:创建和管理数据库
开发语言·数据库·笔记·sql·sqlserver
好记忆不如烂笔头abc18 小时前
oracle迁移到sqlserver的注意点
数据库·oracle·sqlserver
juma90025 天前
探索VSG并联:原理与实践
sqlserver
卓码软件测评7 天前
第三方数据库测试:【utPLSQL用于Oracle和tSQLt用于SQL Server数据库单元测试框架入门】
数据库·oracle·sqlserver·单元测试·mssql
一条咸鱼¥¥¥8 天前
【运维经验】使用QQ邮箱SMTP服务器设置ssms计划任务完成时邮件发送
运维·服务器·经验分享·sql·sqlserver
齐鲁大虾9 天前
SQL SERVER 2008 R2-开发版、企业版、标准版、免费版
sqlserver
江沉晚呤时10 天前
SQL Server 存储过程:从入门到精通
java·服务器·数据库·sqlserver
专注VB编程开发20年10 天前
最快速度取最新一条数据-Mysql,Sql server,access数据库
数据库·sql·mysql·oracle·sqlserver·access
杨云龙UP11 天前
SQL Server小技巧:用 SSMS 重置登录密码,不影响正在运行的系统
运维·服务器·数据库·sql·sqlserver
RestCloud11 天前
SQL Server到Oracle:不同事务机制下的数据一致性挑战
数据库·oracle·sqlserver·etl·cdc·数据处理·数据传输