一下是我sql存储过程ALTER PROCEDURE [dbo].[Pro_insertjudge]
-- Add the parameters for the stored procedure here
@sqlTable    varchar(50),                     --表明   结尾加入逗号,否则会提示语法错误!!!!!
@sqlValues   VARCHAR(1000)                    --插入的数据,如果是字符需要单引号,同时用逗号隔开
AS
BEGIN
-- SET NOCOUNT ON added to prevent extra result sets from
-- interfering with SELECT statements.
SET NOCOUNT ON;
    -- Insert statements for procedure here
DECLARE @sqlan VARCHAR(1000)
SET @sqlan = 'INSERT INTO'+@sqlTable+'VALUES ('+@sqlValues+')'
EXEC (@sqlan)
END
一下是我执行存储过程
其中PPC表只有一列IDEXEC Pro_insertjudge
    @sqlTable = 'PPC',
@sqlValues ='F001'但是系统老是提示我,“)”附近有语法错误。 我找不到具体出问题的地方,我是哪里错了呢?问题有些基础,因为我是新手,谢谢各位
顺便问个问题,加入我的PPC表有两列,分别为ID和Name,@qlValue='F001','李磊',我尝试过这么写,但是系统老是报错
必须传递参数 3,并以 '@name = value' 的形式传递后续的参数。一旦使用了 '@name = value' 形式之后,所有后续的参数就必须以 '@name = value' 的形式传递。请问这个是什么原因?
或者说@sqlValue  我怎么可以让他给拥有多列的表传值呢?

解决方案 »

  1.   

    -- INTO 后 、VALUES 前,各加一个空格    SET @sqlan = 'INSERT INTO '+@sqlTable+' VALUES ('+@sqlValues+')'
      

  2.   

    @wmxcn2000
    顺便问个问题,加入我的PPC表有两列,分别为ID和Name,@qlValue='F001','李磊',我尝试过这么写,但是系统老是报错
    必须传递参数 3,并以 '@name = value' 的形式传递后续的参数。一旦使用了 '@name = value' 形式之后,所有后续的参数就必须以 '@name = value' 的形式传递。请问这个是什么原因?
    或者说@sqlValue  我怎么可以让他给拥有多列的表传值呢?
      

  3.   

    USE tempdb
    GO
    IF OBJECT_ID('test') IS NOT NULL
    DROP TABLE test
    GO
    CREATE TABLE test(ID NVARCHAR(50) PRIMARY KEY,[Name] NVARCHAR(300))
    GO
    IF OBJECT_ID('[dbo].[Pro_insertjudge]') IS NOT NULL
    DROP PROC [dbo].[Pro_insertjudge]
    GO
    CREATE PROCEDURE [dbo].[Pro_insertjudge]
        @sqlTable    varchar(50),                     --表明   结尾加入逗号,否则会提示语法错误!!!!!
        @sqlValues   VARCHAR(1000)                    --插入的数据,如果是字符需要单引号,同时用逗号隔开
    AS
    BEGIN
        SET NOCOUNT ON;
        DECLARE @sqlan VARCHAR(1000)
        SET @sqlan = 'INSERT INTO '+@sqlTable+' VALUES ('+@sqlValues+')'
        PRINT @sqlan
        EXEC (@sqlan)
    END
    GO
    EXEC [dbo].[Pro_insertjudge] 'test','''F001'',''李磊'''
    SELECT * FROM test
    /*
    ID     Name
    F001 李磊
    */
    试了一下, 没问题的。 
    如果你还有问题, 最好像我这样, 给出完整的测试的代码。
      

  4.   

    建议你直接存储过程解析xml执行吧,同时sql执行不成功还能事务回滚
    ALTER proc [dbo].[sys_ExecNonQuery]
    @sqls xml, --sql语句 xml样式 @data='<sqls>
    --<sql>delete from ....</sql>
    --<sql>insert ...</sql>
     -- </sqls>'
    @ResultVal int output --返回值,0 不成功 1成功
    asdeclare @sql varchar(max),@id uniqueidentifier,@i intset @ResultVal=0Create table #tmp_ExecNonQuery(
    FID uniqueidentifier,
    FVar varchar(max)
    )
    Insert into #tmp_ExecNonQuery(FID,FVar)
    select  NEWID(),
    T.c.value('./text()[1]', 'nvarchar(max)')
    from @sqls.nodes('//sql') as T(c)select @i=COUNT(1) from #tmp_ExecNonQuerybegin try 
       begin tran;
    --执行开始
    WHILE exists(select * from #tmp_ExecNonQuery)
    BEGIN
      select @id=FID,@sql=FVar from #tmp_ExecNonQuery
      exec (@sql)
      delete from #tmp_ExecNonQuery where FID=@id
         END
            ---执行结束                
            set @ResultVal=@i
            
        commit tran
        end try
    begin catch -- 数据回滚
     --将单据状态影响值数据回滚
     --获取
     --将单据状态影响值数据回滚  DECLARE @ErrorMessage NVARCHAR(4000),@ErrorSeverity INT,@ErrorState INT;
     SELECT  @ErrorMessage = ERROR_MESSAGE(),@ErrorSeverity = ERROR_SEVERITY(),@ErrorState = ERROR_STATE();
     set @ResultVal=0
         RAISERROR (@ErrorMessage,@ErrorSeverity,@ErrorState )
     rollback transaction 
    end catch