Зачем нужна эта задача? Вместо того, чтобы хранить денормализованные избыточные копии с тем же именем, которое вы затем должны обновлять вручную, разве вы не можете сохранить его в одном месте и затем присоединиться к нему?
Несколько случайных комментариев о коде.
Почему вы каждый раз отбрасываете и воссоздаете таблицу 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%, поэтому я не использовал его выше.