SQL Server 2000 хранимая процедура - PullRequest
0 голосов
/ 09 мая 2011

Я создал процедуру хранения для обновления имени пациента в нескольких таблицах.Когда я его выполняю, выдает ошибку типа

Сервер: Msg 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

1 Ответ

2 голосов
/ 09 мая 2011

Зачем нужна эта задача? Вместо того, чтобы хранить денормализованные избыточные копии с тем же именем, которое вы затем должны обновлять вручную, разве вы не можете сохранить его в одном месте и затем присоединиться к нему?

Несколько случайных комментариев о коде.

Почему вы каждый раз отбрасываете и воссоздаете таблицу tbname вместо того, чтобы просто использовать усечение?

Хотя почему вы вообще используете для этого постоянный стол? Если у вас есть одновременное выполнение хранимой процедуры, вы можете обновить неправильную запись пациента с неправильным именем. Вы можете просто использовать #temp таблицу или @table переменную

Вам не нужно делать SELECT COUNT(*)... и снова запускать запрос, чтобы получить количество строк. Вы можете просто сделать @@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)', 
              @pid=@pid 

            SET @i1 = @i1 + 1 
        END 
  END  

NB. Вы также можете объединить весь скрипт в одном запросе и выполнить его, но этот метод не гарантирован на 100%, поэтому я не использовал его выше.

...