各位大虾,我在EXCEL VBA中有如下调用SQL SERVER存储过程的代码,如果存储过程中不包含循环判断IF EXISTS(Select * From sysobjects....,则能正常返回所需员工考勤打卡数据,不明白这句判断为啥会出错:
VBA:
Dim Cn As New ADODB.Connection
Dim RS As New ADODB.Recordset
Dim StrCn As String, StrSql As String, GH As String
StrCn = "Provider=SQLOLEDB; Data Source=192.168.1.10,1433; Network Library=DBMSSOCN; Initial Catalog=database1;User ID=sa;Password=2816;"
Set Cm = New Command
Cm.ActiveConnection = StrCn
Cm.CommandType = adCmdStoredProc
Cm.CommandText = "Z_01"
Cm.Parameters(1) = "张三" '参数1:查询此员工的打卡记录
Cm.Parameters(2) = "2014-3-25" '参数2:查询此起始日期及以后到现在的打卡记录
Cn.Open StrCn
Set RS = Cm.Execute
......
.....
SQL SERVER存储过程:
USE [database1]
GO
/****** Object: StoredProcedure [dbo].[Z_01] Script Date: 05/27/2014 08:33:12 ******/
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
ALTER PROCEDURE [dbo].[Z_01]
@GH CHAR(15),@TIME CHAR(16)
AS
declare @y1 int,@y2 int,@m1 int,@m2 int,@sql varchar(7000)
DECLARE @SY CHAR(4),@SM CHAR(2), @NY INT,@NM INT
DECLARE @SYY CHAR(4),@SMM CHAR(2), @NYY INT,@NMM INT
SET @NY=YEAR(@TIME)
SET @NM=MONTH(@TIME)
SET @SY=CAST(year(@TIME) AS CHAR(4))
SET @SM=CAST(month(@TIME) AS CHAR(4))
SET @NYY=YEAR(GETDATE())
SET @NMM=MONTH(GETDATE())
SET @SYY=CONVERT(CHAR(4),GETDATE(),112)
SET @SMM=SUBSTRING(CONVERT(CHAR(4),GETDATE(),112),5,2)
/*追加当期考勤刷卡记录*/
SET @SQL=' SELECT distinct A.bh AS 工号,A.xm AS 姓名 ,B.KDateTime AS 刷卡时间,C.ID AS 刷卡类别,E.CLSNAME AS 班次,A.bh + CONVERT(varchar(8), B.KDateTime, 112) AS 标识码'
..........
WHILE @NY<@NYY or (@NY=@NYY and @NM<=@NMM)
BEGIN
IF EXISTS(Select * From sysobjects where xtype='U' AND Object_ID(N'att_OriginalDataList'+@NY +@NM)=id)
BEGIN
SET @SQL=@SQL+' UNION SELECT A.bh AS 工号,A.xm AS 姓名 ,B.KDateTime AS 刷卡时间,C.ID AS 刷卡类别,E.CLSNAME AS 班次,A.bh + CONVERT(varchar(8), B.KDateTime, 112) AS 标识码 FROM Dazl A '
SET @SQL=@SQL+' LEFT OUTER JOIN att_OriginalDataList'+@NY +@NM +' B ON B.EM_ID=A.uuID
............
SET @NM=@NM+1
IF @NM=13
BEGIN
SET @NY=@NY+1
SET @NM=1
End
END
ELSE
BREAK
End
SET @SQL=@SQL+' ORDER BY 工号,刷卡时间'
EXEC(@SQL)
GO
具体是这样的:
数据库中把每个月的员工打卡记录分表存放,表名前面相同,尾标用YYYYM区别,当前月的没有尾标。但是月初10号左右做上月数据存档之前,是没有建立尾标为上月的打卡记录表的,数据暂存在当前月表中。
查询打卡记录时,先在当前月表中查询,然后再追加历史月份打卡记录,这需要循环并判断历史表是否存在。在SQL查询中,包含IF EXISTS(Select * From sysobjects......语句可以顺利得到查询结果,但是做入存储过程被调用就提示:运行时错误'-2147217913 (80040e07)':自动化(automation)错误。
去掉IF EXISTS判断语句就可以正常调用存储过程并返回结果。请各位大虾帮帮忙,这条判断表是否存在的语句为啥调用时出错呀?!!
------解决方案--------------------
@NY ,@NM是整形,+字符串时数据类型有问题