none
查询分析器运行通过,但VB.NET调用却不行 RRS feed

  • 问题

  • --CREATE PROCEDURE [职员工资管理] --AS

    exec  sp_configure   'allow updates','1'
    GO
    reconfigure   with   override
    GO
    declare @项目名称 nvarchar(200),@操作模式 nvarchar(100)
    set @项目名称='临时工资'
    set @操作模式='增加'
    if @操作模式='增加'
    begin

     set @项目名称='ALTER TABLE dbo.员工工资管理 ADD '+@项目名称+' numeric(19,2)'
    execute  sp_executesql @项目名称
    print @项目名称
    --return
    --处理字段位置
    declare   @colid   int
    select   @colid=colid-1   from   syscolumns  
    where   id=object_id( '员工工资管理')   and   name= '实发工资'--在该字段前插入
    if   @colid   is   null   set   @colid=1
    update   syscolumns   set   colid=colid+1
    where   id=object_id( '员工工资管理')   and   colid> @colid
    update   syscolumns   set   colid=@colid+1
    where   id=object_id( '员工工资管理')   and   colid=(
    select   max(colid)   from   syscolumns  
    where   id=object_id( '员工工资管理'))
    end
    else
    exec('alter table 员工工资管理 drop column ' + @项目名称)

    exec   sp_configure   'allow updates','0'  
    reconfigure   with   override
    GO

    上面的CODE,在查询分析器里运行毫无问题

    但是怎么才能把上面的CODE变成存储过程,被程序调用呢?

    帮帮我啊。我是想将字段插入指定列的前一列,@项目名称 和 @操作模式 作为变量由客户端提交


    学无止境

    2012年6月21日 12:14

答案

  • 这个问题其实不应该用这种方法去处理的

    在 sq l2005 及之后的版本,已经不支持系统表更新

    另外,这种手工更改系统表,也可能引起一些问题(否则微软自己弄的改表结构的,不至于要用到重建表的方法来做了)

    一般这种问题是用表+视图来处理,实际存储数据的表的字段是追加的,保障字段顺序是通过视图来做,提供给用户的也是这个视图

    2012年6月23日 6:45

全部回复

  • GO 不是 T-SQL语句,是查询分析器这类工具所支持的T-SQL批命令的分隔符

    .net 只支持 T-SQL语句的

    你可以在.net 中建一个connection,然后在这个 connection 中通过 sqlcmd 逐个执行每个 GO 分开的 T-SQL 语句

    2012年6月21日 13:15
  • GO 不是 T-SQL语句,是查询分析器这类工具所支持的T-SQL批命令的分隔符

    .net 只支持 T-SQL语句的

    你可以在.net 中建一个connection,然后在这个 connection 中通过 sqlcmd 逐个执行每个 GO 分开的 T-SQL 语句

    您好,真如您所说的,在.net中遇上GO,则执行上面贴子中的每个 GO 分开的 T-SQL 语句

    错误如截图所示:


    学无止境

    2012年6月21日 13:40
  • vb的某个参数出现了问题,貌似不是数据库的问题...
    2012年6月22日 4:03
    版主
  • vb的某个参数出现了问题,貌似不是数据库的问题...

    谢谢您的回复!原因终于找到了。虽然在查询分析器中代码没问题,.NET参数传递也没有问题,但在实际创建存储过程时将'allow updates'写成了'allow   updates',于是问题就出现了。原因在于这两个单词的首尾不能出现空格,中间必须有而且只能有一个空格。有木有??晕死。

    另外又遇上了新问题,在指定位置插入新列之后,再想删除这个插入的列,就找不到办法 了。maco wang能不能帮帮忙?

    这是创建数据库的脚本:

    if exists (select * from dbo.sysobjects where id = object_id(N'[dbo].[员工工资管理]') and OBJECTPROPERTY(id, N'IsUserTable') = 1)
    drop table [dbo].[员工工资管理]
    GO
    CREATE TABLE [dbo].[员工工资管理] (
    	[职员编号] [nvarchar] (50) COLLATE Chinese_PRC_CI_AS NOT NULL ,
    	[员工姓名] [nvarchar] (50) COLLATE Chinese_PRC_CI_AS NULL ,
    	[基本工资] [decimal](19, 2) NULL ,
    	[岗位工资] [decimal](19, 2) NULL ,
    	[伙食补贴] [decimal](19, 2) NULL ,
    	[住房补贴] [decimal](19, 2) NULL ,
    	[医疗保险] [decimal](19, 2) NULL ,
    	[住房公积金] [decimal](19, 2) NULL ,
    	[养老保险] [decimal](19, 2) NULL ,
    	[其他补贴] [decimal](19, 2) NULL ,
    	[实发工资] [decimal](19, 2) NULL 
    ) ON [PRIMARY]
    GO

    下面是原来原来的删除插入列的过程:仅能用于'alter table 员工工资管理 drop column ' + @项目名称----用于删除在指定列插入的,就失效了

    CREATE PROCEDURE [DelColumn] 
    	( @项目名称 	[nvarchar](8)) 
    AS 
    DECLARE @tablename VARCHAR(100), @columnname VARCHAR(100), @tab VARCHAR(100) 
    SET @tablename='员工工资管理' 
    SET @columnname=@项目名称 
    declare @defname varchar(100) 
    declare @cmd varchar(100) 
    select @defname = name 
    FROM sysobjects so 
    JOIN sysconstraints sc 
    ON so.id = sc.constid 
    WHERE object_name(so.parent_obj) = @tablename 
    AND so.xtype = 'D' 
    AND sc.colid = 
    (SELECT colid FROM syscolumns 
    WHERE id = object_id(@tablename) AND 
    name = @columnname) 
    select @cmd='alter table '+ @tablename+ ' drop constraint '+ @defname 
    if @cmd is null 
    begin 
    set @cmd='alter table 员工工资管理 drop column ' + @项目名称 
    end 
    else 
    begin 
    exec (@cmd) 
    exec('alter table 员工工资管理 drop column ' + @项目名称) 
    end 
    GO
    maco wang能不能帮帮忙?您举手之劳吧?

    学无止境

    2012年6月22日 7:42
  • 这个问题其实不应该用这种方法去处理的

    在 sq l2005 及之后的版本,已经不支持系统表更新

    另外,这种手工更改系统表,也可能引起一些问题(否则微软自己弄的改表结构的,不至于要用到重建表的方法来做了)

    一般这种问题是用表+视图来处理,实际存储数据的表的字段是追加的,保障字段顺序是通过视图来做,提供给用户的也是这个视图

    2012年6月23日 6:45
  • 已经不支持系统表更新?哪里有写更新系统表?

    给我写信: QQ我:点击这里给我发消息

    2012年6月24日 10:19
  • There's 'update syscolumns ...' in original post.
    2012年6月24日 17:28
  • reconfigure   with   override

    with override是什么意思?我一般不加  with   override也可以哦


    给我写信: QQ我:点击这里给我发消息


    2012年6月25日 4:23
  • Depends on which option you change, always need 'with override' on sql2k and earlier versions.
    2012年6月25日 12:57
  • 你的意思是说 最好写上 'with override'  对吧


    给我写信: QQ我:点击这里给我发消息

    2012年6月25日 14:01
  • Not necessary on sql2k5 and later, sql will tell you if need it.
    2012年6月25日 14:15
  • sql will tell you ?感觉头晕了,我觉得最好还是不要加,运行的时候报错,如果报错说要加上 'with override' 才加

    给我写信: QQ我:点击这里给我发消息

    2012年6月25日 15:05