You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

SQL Server存储过程执行时出现无效列错误求助

问题原因及解决方案

核心错误原因:动态SQL拼接时,字符串类型的@tuwi未添加单引号,数据库将Z303400识别为列名而非字符串参数,触发「无效列名」错误。

修复步骤

  • 修正动态SQL参数传递方式:避免直接拼接字符串参数,改用sp_executesql参数化传递,既解决语法问题又防范SQL注入
  • 修正拼写错误:将Canada分支的wellbehaviour_Canda改为wellbehaviour_Canada,避免找不到对应表
  • 移除无效代码:删除未使用且存在类型不匹配错误的@number变量
  • 增加参数校验:添加@SchemaName非空判断,防止传入未定义的国家参数生成无效SQL
  • 规范表名拼接:使用QUOTENAME函数包裹表名,避免表名含特殊字符时出现语法错误

修复后的存储过程代码

SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO

ALTER PROCEDURE [dbo].[sp_wellbehavior]
(
    @tuwi nvarchar(50),
    @country varchar(50)
)
AS
BEGIN
    SET NOCOUNT ON
    declare @query as nvarchar(1800)
    declare @SchemaName as varchar(100)
    declare @well_name as nvarchar(100)

    set @SchemaName = case @country
        when 'US' Then  'wellbehaviour_US'
        when 'Canada' Then  'wellbehaviour_Canada'
        when 'Australia' Then  'wellbehaviour_Australia'
        when 'Japan' Then 'wellbehaviour_Japan'
        when 'China' Then 'wellbehaviour_China'    
    END

    IF @SchemaName IS NULL
    BEGIN
        RAISERROR('不支持的国家参数', 16, 1)
        RETURN
    END
    
    set @well_name = (select well_name from well.well_mapping where index_id = @tuwi)
    set @query = N'SELECT [date], [asset], [index_id], [well_name], [open], [gas], [oil], [water], [whp], [wht], [bhp], 
    [bht], [cluster], [flag], [display_cluster] FROM datascience.' + QUOTENAME(@SchemaName) + N' where well_view_id = @tuwi'
    
    Execute sp_executesql @query, N'@tuwi nvarchar(50)', @tuwi = @tuwi
END

验证执行

使用原调用语句即可正常运行:

DECLARE @RC int
DECLARE @tuwi nvarchar(50)
DECLARE @country varchar(50)

EXECUTE @RC = [dbo].[sp_wellbehavior]
@tuwi = 'Z303400', @country ='Japan'

GO

内容的提问来源于stack exchange,提问作者Anil Kumar Ulchala

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.11 03:44:52