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