Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/261.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
我的SQL存储过程中的未知无效类型converson_Sql_Sql Server_Ms Access_Stored Procedures_Vba - Fatal编程技术网

我的SQL存储过程中的未知无效类型converson

我的SQL存储过程中的未知无效类型converson,sql,sql-server,ms-access,stored-procedures,vba,Sql,Sql Server,Ms Access,Stored Procedures,Vba,错误:将nvarchar值“WOID值”转换为数据类型int时,转换失败 系统背景:使用MS Access 2010在VBA中编码。目前正在处理代码隐藏模块并调用存储过程。存储过程用SQL编写,并在存储数据库的Ms SQL server 2008应用程序上运行 存储过程:存储过程的目的是: 检索三个输入参数:WOID、SampleID和分析物 连接两个表:tblWoSampleTest、tblTest 选择三个值匹配的testID 在输出参数中保存检索到的testId的值 注:WOID和Sa

错误:将nvarchar值“WOID值”转换为数据类型int时,转换失败

系统背景:使用MS Access 2010在VBA中编码。目前正在处理代码隐藏模块并调用存储过程。存储过程用SQL编写,并在存储数据库的Ms SQL server 2008应用程序上运行

存储过程:存储过程的目的是:

  • 检索三个输入参数:WOID、SampleID和分析物
  • 连接两个表:tblWoSampleTest、tblTest
  • 选择三个值匹配的testID
  • 在输出参数中保存检索到的testId的值
注:WOID和SampleID柱在tblWoSampleTest中,分析物在tbltest中

这是我在SQL management Studio上测试过的代码,看起来很有效。有一个IsNUll语句,因为有时testId不存在,如果返回零,我知道跳过某些逻辑

CREATE PROCEDURE upGetTestIDForAnalyte @WOID 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 @WOID = t1.WOID AND @SampleID = t1.SampleID AND @Analyte = t2.Analyte

SELECT @TestID =ISNULL(@TestID,0) 

go
在访问过程中,WOID被声明为字符串。另外,当我查看tblWOSAmpleTest it nvarchar的WOID列中的数据类型时,SampleID为int,分析物为int。对可能出现的错误有何建议?如果在调用与实际存储过程相反的存储过程时经常发生这种类型的错误,我也可以提供VBA代码 更新调用代码:

Set cmd = New ADODB.Command
    cmd.ActiveConnection = Conn
    cmd.CommandType = adCmdStoredProc
    cmd.CommandText = "upGetTestIDForAnalyte"

    cmd.Parameters.Append cmd.CreateParameter("@Analyte", adVarChar, adParamInput, 60, Analyte)
    cmd.Parameters.Append cmd.CreateParameter("@WOID", adVarChar, adParamInput, 60, ThisWOID)
    cmd.Parameters.Append cmd.CreateParameter("@SampleID", adDouble, adParamInput, 60, ThisSampleID)
    cmd.Parameters.Append cmd.CreateParameter("@testid", adDouble, adParamOutput, , adParamReturnValue)
    cmd.Execute
    Conn.Close
    ThisTestID = cmd.Parameters("@testid").Value
此外,t1.WOID将是tblWOsampletest中列WOID的数据类型,该列的类型为nvarchar(10)。另外,我传递给存储过程的字符串看起来像“1406-00591” Update2:以下是tblwosampletest(t1)的表定义


尝试手动将t1.WOID转换为nvarchar

CREATE PROCEDURE upGetTestIDForAnalyte @WOID 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 @WOID = CONVERT(NVARCHAR,t1.WOID) AND @SampleID = t1.SampleID AND @Analyte = t2.Analyte

SELECT @TestID =ISNULL(@TestID,0) 

希望这有帮助。

请包括呼叫代码。很可能这部分
WHERE@WOID=t1.WOID
失败了。
t1.WOID的类型是什么?
?能否再次检查t1.WOID的数据类型?我不相信表中是nvarchar。我更新了我的问题,以包括一些澄清。您可以在问题中添加tblWOSampleTest的表定义吗?如果数据库中已经有nvarchar(10),为什么要键入cast?我过去也有类似的问题,如果一个皈依者会有所帮助,那么他和我的问题是一样的。仅供参考,我不是那个否决你答案的人。
CREATE PROCEDURE upGetTestIDForAnalyte @WOID 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 @WOID = CONVERT(NVARCHAR,t1.WOID) AND @SampleID = t1.SampleID AND @Analyte = t2.Analyte

SELECT @TestID =ISNULL(@TestID,0)