SQL存储过程未设置参数却仍传值问题咨询
问题分析与解答
咱们先把你提供的存储过程代码格式化出来,方便更清晰地查看:
ALTER PROCEDURE [dbo].[XXXXX] @type varchar(20), @Name varchar(20), @DayVal int, @MonthVal int, @YearVal int AS BEGIN If type='yyy' begin insert into dbo.destinationDB (name,Dayval,Monthval,Yearval) values (@name,@DayVal,@MonthVal,@YearVal) -- 注:你的代码片段缺少闭合的END语句,应该是粘贴时没贴全 END
接下来解释你疑惑的核心问题——为什么你觉得“未定义”的参数却能正常传值更新表:
SQL Server参数大小写不敏感
默认情况下,SQL Server使用的排序规则是不区分大小写的(比如常见的SQL_Latin1_General_CP1_CI_AS,其中CI就是Case Insensitive的缩写)。这意味着存储过程定义里的@Name和你代码里写的@name是同一个参数,同理@MonthVal和@Monthval、@YearVal和@Yearval也都是同一个变量。系统会自动识别这些大小写不同的写法为同一个参数,所以根本不存在“未定义”的情况。@DataVal是笔误
你提问里提到的@DataVal应该是代码里@DayVal的拼写错误——存储过程明明已经定义了@DayVal参数,代码里也正确引用了它,所以这个参数是合法存在的,自然能正常传递值。
另外还要提醒你一个潜在的bug:代码里的If type='yyy'这里的type没加@符号,这是个风险点。SQL Server如果找不到局部变量,会尝试去匹配全局变量、当前上下文的列名等对象,如果恰好有同名的对象存在,很可能会导致逻辑出错。正确的写法应该是If @type='yyy',明确引用存储过程的输入参数。
内容的提问来源于stack exchange,提问作者Karl
相关产品推荐
相关产品推荐

