由于不能保证所有环境中的 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