create proc Pro_select_jkd
 @djh nvarchar(20 @zdr nvarchar(30)
as
declare @SqlS nvarchar(500)set @SqlS='select * from Wl_Jkd where 1=1'
if @djh!=''
set @SqlS+='and djh='+@djh
if @zdr!=''
set @SqlS+='and zdr='+@zdr
 
execute(@SqlS)如果执行下面的语句没错
exec Pro_select_jkd '001',''但是执行下面的语句就有错了(条件变成字符型)
exec Pro_select_jkd 'dsd1',''
exec Pro_select_jkd '001','dsfsd'消息 102,级别 15,状态 1,第 1 行
'dsd1' 附近有语法错误。

解决方案 »

  1.   

    create proc Pro_select_jkd
     @djh nvarchar(20),
     @zdr nvarchar(30)
    as
    declare @SqlS nvarchar(500)set @SqlS='select * from Wl_Jkd where 1=1'
    if @djh!=''
    set @SqlS+=' and djh='''+@djh+''''
    if @zdr!=''
    set @SqlS+=' and zdr='''+@zdr+''''
     
    execute(@SqlS)
      

  2.   

    create proc Pro_select_jkd
     @djh nvarchar(20 ,@zdr nvarchar(30)
    as
    begin
    declare @SqlS nvarchar(500)
      set @SqlS='select * from Wl_Jkd where 1=1'
      if @djh <> ''
         set @SqlS = @SqlS + ' and djh = ''' + @djh + ''''
      if @zdr <> ''
         set @SqlS = @SqlS + ' and zdr = ''' + @zdr + ''''
     
    execute(@SqlS)
    end
      

  3.   

    create proc Pro_select_jkd
     @djh nvarchar(20 @zdr nvarchar(30)
    as
    declare @SqlS nvarchar(500)set @SqlS='select * from Wl_Jkd where 1=1'
    if @djh!=''
    set @SqlS+='and djh='''+@djh+''''
    if @zdr!=''
    set @SqlS+='and zdr='''+@zdr+''''
     
    execute(@SqlS)
      

  4.   

    create proc Pro_select_jkd
     @djh nvarchar(20),
     @zdr nvarchar(30)
    as
    declare @SqlS nvarchar(500)
    set @SqlS='select * from Wl_Jkd where 1=1'if isnull(@djh,'') != ''
    set @SqlS+=' and djh='''+@djh+''''
    if isnull(@zdr,'') != ''
    set @SqlS+=' and zdr='''+@zdr+''''
     
    execute(@SqlS)
    GO最好这样
      

  5.   

    消息 1038,级别 15,状态 4,第 1 行
    缺少对象或列名,或者对象或列名为空。对于 SELECT INTO 语句,请确保每列均具有名称。对于其他语句,请查找空的别名。不允许使用定义为 "" 或 [] 的别名。请将别名更改为有效名称。
    消息 105,级别 15,状态 1,第 1 行
    字符串 '' 后的引号不完整。
      

  6.   

    create table Wl_Jkd(id int identity,djh nvarchar(20),zdr nvarchar(20))
    insert Wl_Jkd select 'dsd1','abcd'
    union all select '001','dsfsd'
    go
    create proc Pro_select_jkd
     @djh nvarchar(20),
     @zdr nvarchar(30)
    as
    declare @SqlS nvarchar(500)
    set @SqlS='select * from Wl_Jkd where 1=1'if isnull(@djh,'') != ''
        set @SqlS+=' and djh='''+@djh+''''
    if isnull(@zdr,'') != ''
        set @SqlS+=' and zdr='''+@zdr+''''
     
    execute(@SqlS)
    GOexec Pro_select_jkd 'dsd1',''
    /*
    id          djh                  zdr
    ----------- -------------------- --------------------
    1           dsd1                 abcd(1 行受影响)
    */
    exec Pro_select_jkd '001','dsfsd'
    /*
    id          djh                  zdr
    ----------- -------------------- --------------------
    2           001                  dsfsd(1 行受影响)
    */我测试OK
      

  7.   

    你真的用了2楼的代码了吗?你的存储过程少了begin end
    create table Wl_Jkd(id int identity,djh nvarchar(20),zdr nvarchar(20))
    insert Wl_Jkd select 'dsd1','abcd'
    union all select '001','dsfsd'
    go
    create proc Pro_select_jkd
     @djh nvarchar(20),
     @zdr nvarchar(30)
    as
    begin
    declare @SqlS nvarchar(500)
    set @SqlS='select * from Wl_Jkd where 1=1'if isnull(@djh,'') <> ''
        set @SqlS = @SqlS + ' and djh='''+@djh+''''
    if isnull(@zdr,'') <> ''
        set @SqlS = @SqlS + ' and zdr='''+@zdr+''''
     
    execute(@SqlS)
    end
    GOexec Pro_select_jkd 'dsd1',''
    /*
    id          djh                  zdr                  
    ----------- -------------------- -------------------- 
    1           dsd1                 abcd(所影响的行数为 1 行)
    */
    exec Pro_select_jkd '001','dsfsd'
    /*
    id          djh                  zdr                  
    ----------- -------------------- -------------------- 
    2           001                  dsfsd(所影响的行数为 1 行)*/drop proc Pro_select_jkd
    drop table Wl_Jkd
      

  8.   

    我知道错在哪了
    if isnull(@djh,'') != ''
        set @SqlS+=' and djh='''+@djh+''''在这呢,那里面我的是双引号,你是两个单引号
    if isnull(@zdr,'') != ''
        set @SqlS+=' and zdr='''+@zdr+''''
      

  9.   

    第1
    set @SqlS+='and djh='+@djh
    if @zdr!=''
    set @SqlS+='and zdr='+@zdr
    的and 前面最好加空格,虽然select * from Wl_Jkd where 1=1and 2=2可以执行第2
    and djh=后面是个字符串,要用''
    你这里可以写成''''代表'',因为他是在字符串里。第3create proc Pro_select_jkd
     @djh nvarchar(20 @zdr nvarchar(30)
    as
    declare @SqlS nvarchar(500)set @SqlS='select * from Wl_Jkd where 1=1'
    if @djh!=''
    set @SqlS+='and djh='+@djh
    if @zdr!=''
    set @SqlS+='and zdr='+@zdr
     print @SqlS
    --execute(@SqlS)
    GO这样的问题以后别问人了,自己把你执行的SQL语句打印出来,就知道错在哪了,何必问人呢