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

Vic*_*Jay 0 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
Run Code Online (Sandbox Code Playgroud)

它在MS-SQL Server Management Studio 2008上执行时效果很好,但在MS-Access 2010(VBA)中调用时,我会收到以下错误:将nvarchar值'1406-00591'转换为数据类型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
Run Code Online (Sandbox Code Playgroud)

再次它在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
Run Code Online (Sandbox Code Playgroud)

最后是的,正确的输出保存到@TestID.太好了,我取得了一些进展.(有点).所以然后我好奇并将'LIKE'改回'='并返回正确的值!在这一点上,我真的不知道发生了什么,但我只是滚动它.然后,我将我的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 
Run Code Online (Sandbox Code Playgroud)

它返回总是将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)' 
Run Code Online (Sandbox Code Playgroud)

结果: 在此输入图像描述 我也定义我的变量传递为:

Dim Analyte As String
Dim ThisWOID As String
Dim ThisSampleID As Long
Dim ThisTestID As Long
Run Code Online (Sandbox Code Playgroud)

链接到上一个问题(不会说它有点令人困惑)我的SQL存储过程中的未知无效类型转换过程 好的如果有人需要更多信息或澄清只是问,谢谢你的帮助!此外,如果你不知道答案,你可以建议我可以做的测试.

Dav*_*lum 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)
Run Code Online (Sandbox Code Playgroud)

你的交易顺序是:

@ThisWOID nvarchar(60), 
@SampleID nvarchar(60),
@Analyte nvarchar(60), 
@TestID int out
Run Code Online (Sandbox Code Playgroud)

除非你在vb中指定cmd.NamedParameters=True然后使用序数顺序,因此你的vb @Analyte被放入SQL中@ThisWOID,并且vb @ThisWOID被放入SQL中@SampleID- 这可能是你的NVARCHAR-INT转换问题.

让你的名字为了,或设置名为PARAMS属性为true,并修复SQL PROC,这样@SampleIDINT对您的表相匹配.

那之后你应该是金.