代码如下
USE test3IF EXISTS (SELECT name FROM sysobjects
   WHERE name='s_map_mohu' and type='P')
DROP PROCEDURE s_map_mohu
go
CREATE PROCEDURE s_map_mohu
@col varchar(20),
@print varchar(600)
AS
SELECT distinct *
FROM economies INNER JOIN
      land ON economies.land_id =land.id INNER JOIN
      sort ON economies.sort_id = sort.id
WHERE @col like '@print' and charindex('@print',@col) > 0 
go
可编译,但是我运行
execute s_map_mohu @print='abc'的时候
出现提示过程 's_map_mohu' 需要参数 '@col',但未提供该参数。
我那不是写条件WHERE @col like '@print' and charindex('@print',@col) > 0 了吗?为什么还会出现这个问题呢?

解决方案 »

  1.   

    你的过程是两个参数呀,@col提供
      

  2.   

    @col 字段名为不固定时,要写动态语句
      

  3.   

    @col varchar(20), --这个你没有.
    @print varchar(600)--这个有
      

  4.   

    少个参数
    execute s_map_mohu '参数','abc'
      

  5.   

    @col like '@print' and charindex('@print',@col) 
    除了参数外 这个语句好像有问题
      

  6.   

    动态语句?还是说我要
    set @col like '%@print%'?
      

  7.   


    --@col要传递exec('SELECT distinct * 
    FROM economies INNER JOIN 
          land ON economies.land_id =land.id INNER JOIN 
          sort ON economies.sort_id = sort.id 
    WHERE '+@col+' like '''+@print+''' and charindex('''+@print+''',@col) > 0') 
      

  8.   


    --@col要传递exec('SELECT distinct * 
    FROM economies INNER JOIN 
          land ON economies.land_id =land.id INNER JOIN 
          sort ON economies.sort_id = sort.id 
    WHERE charindex('''+@print+''','+@col+') > 0') 感觉这样就可以了
      

  9.   

    alter PROCEDURE s_map_mohu 
    @col varchar(20) =null, 
    @print varchar(600) =null  
    AS 
    SELECT distinct * 
    FROM economies INNER JOIN 
          land ON economies.land_id =land.id INNER JOIN 
          sort ON economies.sort_id = sort.id 
    WHERE @col like '@print' and charindex('@print',@col) > 0 
    go 给参数设置为默认数值
    不设置的话你调用存储过程就需要提供这两个默认数值此外,你的存储过程逻辑有问题,相信你可以看到
    你的参数条件不应该也在where 里面的。
    如果想详细询问,发站内信
      

  10.   

    你的存储过程也不对,应该这样
    USE test3 IF EXISTS (SELECT name FROM sysobjects 
      WHERE name='s_map_mohu' and type='P') 
    DROP PROCEDURE s_map_mohu 
    go 
    CREATE PROCEDURE s_map_mohu 
    @col varchar(20), 
    @print varchar(600) 
    AS 
    set @sql='SELECT distinct * 
    FROM economies INNER JOIN 
          land ON economies.land_id =land.id INNER JOIN 
          sort ON economies.sort_id = sort.id 
    WHERE '+@col+' like '''+@print+''' and charindex('''+@print+''','+@col+') > 0 '
    exec (@sql)
    go 
      

  11.   

    修改下
    USE test3 IF EXISTS (SELECT name FROM sysobjects 
      WHERE name='s_map_mohu' and type='P') 
    DROP PROCEDURE s_map_mohu 
    go 
    CREATE PROCEDURE s_map_mohu 
    @col varchar(20), 
    @print varchar(600) 
    declare @sql varchar(2000)
    AS 
    set @sql='SELECT distinct * 
    FROM economies INNER JOIN 
          land ON economies.land_id =land.id INNER JOIN 
          sort ON economies.sort_id = sort.id 
    WHERE '+@col+' like '''+@print+''' and charindex('''+@print+''','+@col+') > 0 '
    exec (@sql)
    go 
      

  12.   

    declare@sqlvarchar(2000)我一直也想问这个declare的用法是啥?
    我一写这个就提示有语法错误,不知道为什么
      

  13.   

    定义参数
    declare @sql varchar(2000) 
      

  14.   

    declare @sql varchar(2000)
    应该加在as 的下面
      

  15.   

    小卒说的对,我位置加错了,不好意思,修改下
    USE test3 IF EXISTS (SELECT name FROM sysobjects 
      WHERE name='s_map_mohu' and type='P') 
    DROP PROCEDURE s_map_mohu 
    go 
    CREATE PROCEDURE s_map_mohu 
    @col varchar(20), 
    @print varchar(600) 
    AS 
    declare @sql varchar(2000)
    set @sql='SELECT distinct * 
    FROM economies INNER JOIN 
          land ON economies.land_id =land.id INNER JOIN 
          sort ON economies.sort_id = sort.id 
    WHERE '+@col+' like '''+@print+''' and charindex('''+@print+''','+@col+') > 0 '
    exec (@sql)
    go 
      

  16.   

    服务器: 消息 201,级别 16,状态 4,过程 s_map_mohu,行 0
    过程 's_map_mohu' 需要参数 '@col',但未提供该参数。
      

  17.   


    execute s_map_mohu @col='这个地方加上你的字段名',@print='abc'
      

  18.   

    这样啊,有点明白了
    那我@col varchar(20)=null
    这样也可以吧
    代码如下
    USE test3 IF EXISTS (SELECT name FROM sysobjects 
      WHERE name='s_map_mohu' and type='P') 
    DROP PROCEDURE s_map_mohu 
    go 
    CREATE PROCEDURE s_map_mohu 
    @col varchar(20)=null, 
    @print varchar(600)
    AS 
    DECLARE @sql varchar(2000)
    set @sql='SELECT distinct * 
    FROM economies INNER JOIN 
          land ON economies.land_id =land.id INNER JOIN 
          sort ON economies.sort_id = sort.id 
    WHERE '+@col+' like '''+@print+''' and charindex('''+@print+''','+@col+') > 0 '
    exec (@sql)
    go 然后执行
    execute s_map_mohu @print='a'就给我显示个
    命令已成功完成。什么也没有了郁闷
      

  19.   

    那我@col varchar(20)=null 你这样的,就相当于动态字段名为null,这也是没有用的,必须传递一个真实的字段值,你想要查询的那个字段
      

  20.   

    其实我是想做我输入的模糊查询嘛
    因为是联合查询,我就想直接@col=@print是不是就可以了
      

  21.   

    你把要求写一下。等会再看,我在重新安装SQL
      

  22.   

    你的存储过程是两个参数,所以需要传两个参数 
    第一个是你要查的表的列名
    第二个是值execute s_map_mohu '列名','值'
      

  23.   

    还是这个存储过程,
    USE test3IF EXISTS (SELECT name FROM sysobjects
       WHERE name='s_map_mohu' and type='P')
    DROP PROCEDURE s_map_mohu
    go
    CREATE PROCEDURE s_map_mohu
    @col varchar(20)=null,
    @print varchar(600)=null
    AS
    SELECT distinct *
    FROM economies INNER JOIN
          land ON economies.land_id =land.id INNER JOIN
          sort ON economies.sort_id = sort.id
    WHERE charindex('@print',@col) > 0 and  @col like '%'+@print+'%'
    go
    因为我查询的东西比较多,比如我要查‘名字,地点,车站’等等
    这些在where后面都要一个一个的写出来吗?
    有简单的写法吗?
      

  24.   

    要是都写的话,我后面也没有必要写
    WHERE charindex('@print',@col) > 0 and  @col like '%'+@print+'%' 直接定义多变量了名字 like @a
    地点 like @b
    车站 like @c是不是就可以了?跟我想做的输入的模糊查询相违背吗?