看一下我的存储过程和调用方法,再回答
if exists (select * from dbo.sysobjects where id = object_id(N'[dbo].[sp_L_MbDetail_Insert]') and OBJECTPROPERTY(id, N'IsProcedure') = 1)
drop procedure [dbo].[sp_L_MbDetail_Insert]
GOSET QUOTED_IDENTIFIER ON 
GO
SET ANSI_NULLS ON 
GO
--------------------------------------------------------------------------
--Procedure Name : [dbo].[sp_L_MbDetail_Insert]
--Note                :  sp_L_MbDetail_Insert
--Created By        : Li
--Created Date     : 2009-8-3    
 --------------------------------------------------------------------------CREATE PROCEDURE [dbo].[sp_L_MbDetail_Insert]
 (
@Field  nvarchar(500),
@Value nvarchar(500),
@tableName nvarchar(100),
@num int output
 )AS
Declare @Sql nvarchar(1000)
begin tran
set @Sql='insert into '+@tableName+'('+@Field+') values('+@Value+')'
exec(@Sql)
set @num=1;
IF @@ERROR<>0
BEGIN
set @num=0
ROLLBACK TRAN
END
ELSE
BEGIN
COMMIT TRAN
ENDreturn
GO
SET QUOTED_IDENTIFIER OFF 
GO
SET ANSI_NULLS ON 
GOexec sp_L_MbDetail_Insert 'Super_Info_SpXlColumnXxSet_12','Xlid,Field128928153557656250,Field128928158271406250,Field128928153670781250','22,0,0,0',0执行的错误提示是下面的
服务器: 消息 170,级别 15,状态 1,行 1
第 1 行: '22' 附近有语法错误。
提示,字段名,表字,插入的内容,都是通过程序传过来的,Xlid是整形,其他都是字符串类型,请问一下这个我应该怎么改比较好,要是有更好的方法也可以提供一下

解决方案 »

  1.   

    你的第三个参数是tablename,值却是'22,0,0,0'顺序搞反了.另:你把@sql print出来看一下就容易多了.
      

  2.   

    exec(@Sql) 
    前加个
    print (@sql)然后在查询分析器中
    执行exec sp_L_MbDetail_Insert 'Super_Info_SpXlColumnXxSet_12','Xlid,Field128928153557656250,Field128928158271406250,Field128928153670781250','22,0,0,0',0 
      

  3.   

    你的Sql语句里的值并不能给出类型,可能你的表里的字段是字符型的,也可能是数值型的,如果是数值型的你就要在值上加上引号,比如22是字符型的就要'22'如:exec sp_L_MbDetail_Insert 'Super_Info_SpXlColumnXxSet_12','Xlid,Field128928153557656250,Field128928158271406250,Field128928153670781250','''22'',0,0,0',0 
      

  4.   

    exec sp_L_MbDetail_Insert 'Xlid,[Field128928153557656250],[Field128928158271406250],[Field128928153670781250]','115,'''厅夺'','''城'','''辰天'','Super_Info_SpXlColumnXxSet_12',0你看这样对吗?
    我改成这样还是出错了
      

  5.   

    关键是你要看拼成后的sql是什么样子.
      

  6.   

    改成这样的
    exec sp_L_MbDetail_Insert 'Xlid,[Field128928153557656250],[Field128928158271406250],[Field128928153670781250]','115,''厅夺'',''城'',''辰天''','Super_Info_SpXlColumnXxSet_12',0
    对了,谢谢四楼,我还想问一下,这个在程序里面怎么加啊?
      

  7.   

    在存储过程中加.
    set @Sql='insert into '+@tableName+'('+@Field+') values('+@Value+')' 
    print(@Sql) 
    exec(@sql)
      

  8.   

    我觉得你最好别这样拼来拼去的。你最好使用参考这个语句来做:
    execute sp_executesql 
              N'select * from pubs.dbo.employee where job_lvl = @level',
              N'@level tinyint',
              @level = 35
      

  9.   

    sp_executesql
    执行可以多次重用或动态生成的 Transact-SQL 语句或批处理。Transact-SQL 语句或批处理可以包含嵌入参数。语法
    sp_executesql [@stmt =] stmt
    [
        {, [@params =] N'@parameter_name  data_type [,...n]' }
        {, [@param1 =] 'value1' [,...n] }
    ]
      

  10.   

    再给你一个参考语句吧。/*使用传入和传出参数*/
    declare @t int
    set @t=0
    execute sp_executesql 
              N'select @count=count(1) from pubs.dbo.employee where job_lvl = @level',
              N'@level tinyint, @count int output',
               @level = 35,@count=@t outputselect @t
    看到这个可能你就理解了,其实很简单,sp_executeSql参数分成了三个部分。
    第一部分就是要执行的Sql语句,这是一个字符串,任意的,只要语法正确。
    第二部分就是所需的参数定义,名称类型及大小方向。
    第三部分就是实际的对应的参数值。按名称匹配。
    在调用完成后可以取到传出参数。