2011-05-09 200 views
0

我创建了一个存储过程,用于更新多个表中的患者名称。当我执行它,显示错误,如sql server 2000存储过程

服务器:消息170,15级,状态1,
1号线1号线:近 '=' 的语法不正确。

这是我的代码。如何恢复它?请帮我

create procedure uppatname @pid varchar(150),@pname varchar(150) 
as begin 
    declare @i as integer 
    declare @i1 as integer 
    declare @ttnm as varchar(100) 
    declare @tblnam as varchar(100) 

    drop table tbname 
    SELECT IDENTITY(int, 1,1) AS RowNumber, table_name 
    INTO tbname 
    FROM information_schema.columns 
    WHERE column_name = 'pid' 
     AND table_catalog = 'hospital' 
     AND table_name NOT LIKE 'T%' 

    SET @i = (select count(*) from information_schema.columns 
      where column_name='pid' and table_catalog='hospital' 
       and table_name not like 'T%') 

    SET @i1 = 1 

    WHILE @i1 <= @i 
    BEGIN 
    SET @tblnam = (select table_name from tbname where rownumber = @i1) 
    SET @ttnm = ('select * from ' + @tblnam + 'where pid = ' + @pid) 
    EXEC (@ttnm) 
    SET @i1 = @i1 + 1 
    END 
END 
+0

为什么患者姓名在多个表中?如果它在功能上依赖于'pid'? – 2011-05-09 11:57:56

回答

2

这个任务的需要是什么?而不是存储非规范化冗余副本的相同名称,然后您必须手动保持最新不能将其存储在一个地方然后加入?

关于代码的一些随机评论。

为什么每次都丢弃并重新创建表tbname而不是仅使用truncate?

虽然你为什么要使用永久表?如果您同时执行存储过程,则最终可能会使用错误的名称更新错误的患者记录。您可以使用#temp表或@table变量

您不需要执行SELECT COUNT(*)...并再次运行查询获取rowcount。你可以做@@rowcount

你应该围绕表名称使用quote_name来限定它。由于pid不是数字,那就需要在查询中被引用但实际上,你应该使用sp_executesql,使您可以参数化pid

CREATE PROCEDURE uppatname @pid VARCHAR(150), 
          @pname VARCHAR(150) 
AS 
    BEGIN 
     DECLARE @i AS INTEGER 
     DECLARE @i1 AS INTEGER 
     DECLARE @dyn_sql AS NVARCHAR(4000) 
     DECLARE @tblnam AS SYSNAME 
     DECLARE @schema_name SYSNAME 

     DECLARE @tbname TABLE ( 
     RowNumber INT IDENTITY(1, 1) PRIMARY KEY, 
     schema_name SYSNAME, 
     table_name SYSNAME) 

     INSERT INTO @tbname 
     SELECT TABLE_SCHEMA, 
      TABLE_NAME 
     FROM INFORMATION_SCHEMA.COLUMNS 
     WHERE COLUMN_NAME = 'pid' 
      AND TABLE_CATALOG = 'hospital' 
      AND TABLE_NAME NOT LIKE 'T%' 

     SET @i = @@ROWCOUNT 
     SET @i1 = 1 

     WHILE @i1 <= @i 
     BEGIN 
      SELECT @tblnam = table_name, 
        @schema_name = schema_name 
      FROM @tbname 
      WHERE RowNumber = @i1 

      SET @dyn_sql = N'SELECT * 
          FROM ' + QUOTENAME(@schema_name) + '.' 
            + QUOTENAME(@tblnam) + ' 
          WHERE pid = @pid'; 

      EXEC sp_executesql 
       @dyn_sql, 
       N'@pid VARCHAR(150)', 
       @[email protected] 

      SET @i1 = @i1 + 1 
     END 
    END 

注意:您还可以串联整个脚本在单个查询并执行它,但该技术不是100%保证,所以我没有使用它。

+0

非常感谢。它的工作很好。谢谢.... – karthik 2011-05-11 07:44:50

+0

我想根据患者id.I更改患者的姓名。我修改了ur编码。但它显示错误 - 必须声明变量'@pname'。 我已将选择查询更改为update.and我的编码为 SET @dyn_sql = N'update' + QUOTENAME(@schema_name)+'。' + QUOTENAME(@tblnam)+ 'set pname = @pname WHERE pid = @pid'; EXEC sp_executesql的 @dyn_sql, N '@ PID VARCHAR(150)', @ PID = @ PID SET @ I1 = I1 @ + 1 END END – karthik 2011-05-11 09:04:03