【问题标题】:Cannot format input parameters correctly for SQL stored procedure无法为 SQL 存储过程正确格式化输入参数
【发布时间】:2014-08-18 16:07:39
【问题描述】:

这就是交易,我有一个存储过程,它接受三个输入参数并有一个输出参数。原来是这样的:

CREATE PROCEDURE upGetTestIDForAnalyte @ThisWOID nvarchar(60), @SampleID nvarchar(60),@Analyte nvarchar(60), @TestId int OUT
AS
   SELECT @TestID = t1.TestID
   FROM tblWOSampleTest t1 JOIN tblTest t2
   ON t1.TestID=t2.TestID 
   WHERE (t1.SampleID =  @SampleID) AND (t2.Analyte =  @Analyte)  AND (t1.WOID = @ThisWoid) 
   SELECT @TestID =ISNULL(@Testid,0) 
Go

在 MS-SQL Server Management Studio 2008 上执行时效果很好,但在 MS-Access 2010 (VBA) 中调用时会出现以下错误:将 nvarchar 值“1406-00591”转换为数据类型时转换失败诠释。 (我的@ThisWoid 输入)

所以基本上我发布了一个关于这个的问题并发布了所有内容(我调用存储过程的方式/表列的数据类型..ect),我被告知一切看起来都很好,它可能与我分配给我的输入参数的值,如果有人好奇,我会在页面底部发布上一个问题的链接。我发现了一种通过使用“LIKE”而不是“=”来消除此错误的漏洞,因为数据类型约束对“LIKE”没有那么严格(我知道不是最好的解决方案,但我很想取得进展)。无论如何,现在我的 SQL 代码如下所示:

CREATE PROCEDURE upGetTestIDForAnalyte2 @ThisWOID nvarchar(60), @SampleID nvarchar(60),@Analyte nvarchar(60), @TestId int OUT
AS
   SELECT @TestID = t1.TestID
   FROM tblWOSampleTest t1 JOIN tblTest t2
   ON t1.TestID=t2.TestID 
   WHERE (t1.SampleID LIKE  @SampleID) AND (t2.Analyte Like  @Analyte)  AND (t1.WOID Like @ThisWoid) 
   SELECT @TestID =ISNULL(@Testid,0) 
go

再次,它在 SQL Management Studio 中运行良好,但是当我在 MS-Access 中调用它时,它总是返回 0。所以为了进行一个小测试,我再次更改了 SQL 代码,以查看它是否可以通过强制值返回零以外的值我知道肯定会返回一个值,这是代码:

CREATE PROCEDURE upGetTestIDForAnalyte3 @ThisWOID nvarchar(60), @SampleID nvarchar(60),@Analyte nvarchar(60), @TestID int out
AS
   Select @TestID = t1.testid 
   From tblWOSampleTest t1 JOIN tbltest t2 
   On t1.testid = t2.testid
   Where  (t1.woid LIKE '1406-00591') AND (t2.Analyte LIKE 'lead') AND (t1.SampleID LIKE 1)
   SELECT @TestID =ISNULL(@Testid,0) 
Go

最后是的,正确的输出被保存到@TestID。太好了,我取得了一些进展。 (有点)。所以我很好奇并将“LIKE”改回“=”,它返回正确的值!在这一点上,我真的不知道发生了什么,但我只是顺其自然。所以然后我将我的 SQL 代码改回 upGetTestIDForAnalyte2 (顺便说一句,我对它们进行了不同的标记),当我调用我的存储过程时,我采用这些相同的值并将它们分配给输入参数,如下所示:

Set cmd = New ADODB.Command
    cmd.ActiveConnection = Conn
    cmd.CommandType = adCmdStoredProc
    cmd.CommandText = "upGetTestIDForAnalyte2"
    cmd.Parameters.Append cmd.CreateParameter("@Analyte", adVarChar, adParamInput, 60, "lead")
    cmd.Parameters.Append cmd.CreateParameter("@ThisWOID", adVarChar, adParamInput, 60, "1406-00591")
    cmd.Parameters.Append cmd.CreateParameter("@SampleID", adDouble, adParamInput, 60, 1)
    cmd.Parameters.Append cmd.CreateParameter("@testid", adDouble, adParamOutput, , adParamReturnValue)
    cmd.Execute
    Conn.Close

    ThisTestID = cmd.Parameters("@testid").Value 

它返回总是将 TestId 设置为 0。我还将我的 ThisTestID 初始化为 5 以确保其更改,并且它正在更改为 0。只是为了确保我使用相同的输入值运行了 GetTestIDForAnalyte 并且我得到了相同的错误我得到了上面。所以这就是我现在的位置。这是我从 SQL 代码中获得的有关我正在使用的表的一些信息:

SELECT COLUMN_NAME, DATA_TYPE, CHARACTER_MAXIMUM_LENGTH, IS_NULLABLE 
FROM INFORMATION_SCHEMA.COLUMNS IC
where (TABLE_NAME = 'tblwosampletest' and COLUMN_NAME = 'woid')
  OR (TABLE_NAME = 'tblwosampletest' and COLUMN_NAME = 'sampleID')
  OR (TABLE_NAME = 'tbltest' AND COLUMN_NAME = 'Analyte)' 

结果: 我还定义了我的变量传递为:

Dim Analyte As String
Dim ThisWOID As String
Dim ThisSampleID As Long
Dim ThisTestID As Long

链接到上一个问题(不会说谎,这有点令人困惑)Unknown invalid type converson in my SQL stored Procedure 好的,如果有人需要更多信息或澄清,请询问,感谢您的帮助!另外,如果您不知道答案,您能否建议我可以做的测试。

【问题讨论】:

  • 我只是碰巧注意到,您的 VBA 代码和存储过程的案例对于 TestId 是不同的 - 在您的 VBA 代码中它是“@testid”,而在存储过程中它是“@TestId”。不确定它是否区分大小写。您能否使其保持一致并使用 upGetTestIDForAnalyte2 再次尝试您的示例?
  • 我试过了,好像没什么区别
  • 你对我能做的测试有什么建议吗?
  • 作为输入变量的测试,在 SQL 中创建一个表,然后在您的 proc 中,将变量插入到表中,然后查看写入的内容。确认你的变量正在进入过程......采取一些小步骤,直到你发现哪里出了问题。
  • SampleID 也是 SQL 中的一个 INT...但您的 proc 变量是 nvarchar。此外,您的 vb 代码参数顺序与 SQL 输入参数顺序不匹配...我相信除非您指定 cmd.NamedParameters = True,否则参数将按顺序使用。

标签: sql sql-server ms-access stored-procedures vba


【解决方案1】:

您的变量顺序与 PROC 不一致。

您的 VB 订单是:

cmd.Parameters.Append cmd.CreateParameter("@Analyte", adVarChar, adParamInput, 60, "lead")
cmd.Parameters.Append cmd.CreateParameter("@ThisWOID", adVarChar, adParamInput, 60, "1406-00591")
cmd.Parameters.Append cmd.CreateParameter("@SampleID", adDouble, adParamInput, 60, 1)
cmd.Parameters.Append cmd.CreateParameter("@testid", adDouble, adParamOutput, , adParamReturnValue)

你的 proc 顺序是:

@ThisWOID nvarchar(60), 
@SampleID nvarchar(60),
@Analyte nvarchar(60), 
@TestID int out

除非您在 vb 中指定 cmd.NamedParameters=True,否则将使用序数顺序,因此您的 vb @Analyte 被放入 SQL @ThisWOID,而 vb @ThisWOID 被放入 SQL @SampleID - - 这可能是您的NVARCHAR-INT 转换问题。

按顺序获取您的名称,或将命名参数属性设置为 true,并修复您的 SQL 过程,以便 @SampleIDINT 以匹配您的表。

在那之后你应该是金色的。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2021-10-25
    • 1970-01-01
    • 1970-01-01
    • 2014-06-20
    • 2014-10-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多