SELECT COUNT(DISTINCT dbo.visitstate.visitip) AS count1 FROM dbo.visitstate WHERE year(visitdate)='2009'; 这个语句是选择2009年访问IP的数量(重复的只计算一次,visitip字段保存是访问ip的数据,visitdate是访问时间字段)
这个语句在vs2008中运行正常。因为年份是变化的,所以我改为过程参数来控制,@yearl  int   
SELECT COUNT(DISTINCT dbo.visitstate.visitip) AS count1 FROM dbo.visitstate WHERE year(visitdate)=@yearl; 在后台也给@yearl赋值了,过程应该没有错,但运行后提示我存储过程有语法错误,问题是在sql中运行成功,所以不知道错误发生在哪希望大家能帮我看下,大家一起提高

解决方案 »

  1.   

    SELECT COUNT(DISTINCT dbo.visitstate.visitip) AS count1 FROM dbo.visitstate WHERE year(visitdate)=convert(varchar,@yearl); 
    不知道是不是類型檢查,你試一下
      

  2.   

    @yearl  int 估计是你这个的数据类型的问题
      

  3.   

    SELECT COUNT(DISTINCT dbo.visitstate.visitip) AS count1 FROM dbo.visitstate WHERE ltrim(year(visitdate))=@yearl
    --试一下,估计是类型错误。。
      

  4.   


    SELECT COUNT(DISTINCT dbo.visitstate.visitip) AS count1 FROM dbo.visitstate WHERE year(visitdate)=@yearl;visitstate  表名怎么和  字段 visitdate是一样的》???????
    是不是,字段写错了!
      

  5.   

    @yearl  声明为字符型吧!
      

  6.   

    按你说法,我可以先定义 @yearl varchar(50),但还是不可以。转换也不可以,仍然提示语法有错误
      

  7.   

    但year() 类型是int啊,问题是我试了varchar bigint int 都不可以啊,应该是什么类型呢
      

  8.   

    有谁能实验下吗,从数据库提取某年的数据,年用存储过程参数@yearl,然后后台赋值,看看行不,如果行能把代码给我下
      

  9.   

    SELECT COUNT(DISTINCT visitip) AS count1 FROM visitstate 
    WHERE year(visitdate)= cast(@yearl as varchar(50)
      

  10.   

    @yearl  int  SELECT COUNT(DISTINCT visitip) AS count1 FROM dbo.visitstate WHERE year(visitdate)=@yearl
      

  11.   


    create procedure sp_test 
    @year1 int
    as
    begin
    with tb(val) as
    (
    select '2009-10-01'
    union all
    select convert(varchar(10),dateadd(mm,1,convert(datetime,val)),120) from tb where val<='2010-10-09'
    )
    select row_number() over(order by getdate()) as id,tb.* from tb where year(convert(datetime,val)) = @year1
    endexec sp_test 20092005下沒問題,懷疑你的存儲過程有問題