当前位置: 代码迷 >> Sql Server >> EXCEL VBA调用SQL SERVER存储过程时判断某表是不是存在出错
  详细解决方案

EXCEL VBA调用SQL SERVER存储过程时判断某表是不是存在出错

热度:56   发布时间:2016-04-24 10:33:58.0
EXCEL VBA调用SQL SERVER存储过程时判断某表是否存在出错
各位大虾,我在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是整形,+字符串时数据类型有问题
  相关解决方案