CREATE PROCEDURE SP_insertXXB
@tableName nvarchar(20),
@服务类型 nvarchar(2),
@帐单类型 nvarchar(4),
@计费 money
AS
declare @sql varchar(2000)
set @sql='insert into' + @tableName +'('+
'服务类型,帐单类型,计费'+
')'+'values' + '(' +
@服务类型+','+
@帐单类型+','+
cast(@计费 as varchar(20))+','+ ')'
exec(@sql)
GO

解决方案 »

  1.   

    @计费+','+ ')'
    =============>
    convert(varchar,@计费)+','+ ')'
      

  2.   

    cast(@计费 as varchar(20))  --把计费显示转换成varchar(20)
      

  3.   

    若在存储过程中转换了数据类型,这样可以正确生成存储过程。但是在插入数据时,无法将varchar类型的数据插入到money类型的字段中。各位高手有什么高见?
      

  4.   

    我倒是有个想法儿,就是麻烦点儿。
    先插入一条记录的其他字段,然后再些一条insert语句用来插入这特殊的一列,呵呵
      

  5.   

    若是不用动态sql语句可以实现固定表的数据插入:
    CREATE PROCEDURE SP_insertXXB
    @服务类型 nvarchar(2),
    @帐单类型 nvarchar(4),
    @计费 money
    AS
    insert into XXB_200506(服务类型,帐单类型,计费) values(@服务类型,@帐单类型,@计费)
    GO为什么用了表名变量就就会报错?
    CREATE PROCEDURE SP_insertXXB
    @tableName nvarchar(20),
    @服务类型 nvarchar(2),
    @帐单类型 nvarchar(4),
    @计费 money
    AS
    insert into @tableName(服务类型,帐单类型,计费) values(@服务类型,@帐单类型,@计费)
    GO
      

  6.   

    你的 计费 字段是什么类型的???下面这个最简单的是会报错的(不能隐式转换):
    create table a(
    m varchar(20)
    )declare @m money
    set @m=12313.132
    insert into a values(@m)
      

  7.   

    表结构是这样的:
    CREATE TABLE [XXB] (
    [序号] [numeric](18, 0) IDENTITY (1, 1) NOT NULL ,
    [服务类型] [nvarchar] (2) COLLATE Chinese_PRC_CI_AS NOT NULL ,
    [帐单类型] [nvarchar] (4) COLLATE Chinese_PRC_CI_AS NOT NULL ,
    [计费] [money] NULL
    ) ON [PRIMARY]
    GO计费字段是money类型的
      

  8.   

    create table a(
    m money
    )declare @m money,@sql varchar(1000)
    set @m=12313.132
    set @sql='insert into a values('+@m+')'  --这是因为 'insert into a values(' 是一个字符串,它不能跟 @m money 类型相加,所以要先转化 @m 为字符串类型才行
    select @sql
    execute(@sql)
      

  9.   

    为什么不用动态sql语句就会报错@tableName未定义呢?
    CREATE PROCEDURE SP_insertXXB
    @tableName nvarchar(20),
    @服务类型 nvarchar(2),
    @帐单类型 nvarchar(4),
    @计费 money
    AS
    insert into @tableName(服务类型,帐单类型,计费) values(@服务类型,@帐单类型,@计费)
    GO