无法为SQL存储过程正确格式化输入参数

时间:2014-06-27 13:57:52

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

所以这里的交易,我有一个存储过程,接受三个输入参数,并有一个输出参数。最初它看起来像这样:

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&# 39;到数据类型int。 (我的@ThisWoid输入)

所以基本上我发布了一个关于这个的问题,我发布了所有内容(我调用存储过程的方式/表columns..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。太好了,我取得了一些进展。 (有点)。所以,我好奇并改变了“喜欢”。回到' ='它返回正确的值!在这一点上,我真的不知道发生了什么,但我只是随便滚动。然后我将我的SQL代码更改回upGetTestIDForAnalyte2(我将它们标记为不同的btw),当我调用我的存储过程时,我采用相同的值并将它们分配给输入参数,如:

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.只是为了确保我使用相同的输入值运行upGetTestIDForAnalyte并且我得到了相同的错误我上面了。所以这就是我现在所处的位置。以下是我从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)' 

结果:enter image description here 我还将我的变量定义为:

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 好的,如果有人需要更多信息或澄清,请询问,谢谢你的帮助!此外,如果你不知道答案,你可以建议我做的测试。

1 个答案:

答案 0 :(得分:5)

您的变量订单与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)

你的处理顺序是:

@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转换问题。

按顺序获取您的名字,或将命名的params属性设置为true,并修复您的SQL proc,以使@SampleID与您的表格匹配INT

之后你应该是金色的。