2011-05-09 215 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