Как переслать даты демо-данных с помощью хранимой процедуры? - PullRequest
0 голосов
/ 16 июня 2009

Я ищу чистый способ пересылки некоторых демонстрационных данных с использованием хранимой процедуры. Данные, которые я хочу переслать, являются типами даты. Из-за особенностей моего приложения некоторые данные в моем приложении будут отображаться только в том случае, если в будущем появятся определенные даты. Я надеюсь это имеет смысл. : S

Поскольку моя база данных постоянно расширяется, я подумывал написать хранимую процедуру, которая, по сути, перенаправляет все даты во все таблицы в моей базе данных, которые принадлежат демонстрационной учетной записи пользователя. Я также буду следить за датой последней отправки демо-данных. Очевидно, что сохраненный процесс запускается при входе в систему демонстрационных данных, и когда разница между последней датой демонстрационных данных была переадресована и текущая дата встретила определенную разницу во времени (например, 30 дней). Таким образом, мне не нужно постоянно менять скрипт.

Теперь к технической части:

Я использую это для получения всех таблиц в БД:

Select 
    table_name 
from 
    Information_Schema.Tables 
Where 
    TABLE_TYPE like 'BASE TABLE' 
    and table_name not like 'Report_%' 
    and table_name not in ('Accounts', 'Manifest', 'System', 'Users')

Мне нужен способ перебирать имена таблиц, находить имена столбцов и типы столбцов. Затем я хочу обновить все столбцы в каждой таблице типа datetime. Я читал, что зацикливание в SQL не является идеальным, но я бы хотел минимизировать количество обращений к базе данных, а не помещать это в код на стороне сервера.

Я иду по неверному пути, чтобы решить эту проблему?

Заранее спасибо.

1 Ответ

0 голосов
/ 16 июня 2009

Я согласен с комментарием, что, возможно, не стоит делать это автоматически и скрытно, но если вы хотите, вы можете использовать это.

(обратите внимание, что предполагается, что SQL Server)

select T.Name, C.Name 
from sys.tables T
join sys.columns C
on T.object_id = C.object_id
and C.system_type_id = 61 -- I would do a little researcht o make sure 61 is all you need to return here

Это даст вам список всех столбцов даты и времени вместе с таблицей, в которой он находится по имени.

Тогда я бы сделал так, чтобы у меня был курсор, который на лету строит строки обновления и исполняет их примерно так:

DECLARE @UpdateString varchar(500)
DECLARE @DaysToAdd int
DECLARE @TableName VARCHAR(100)
DECLARE @ColumnName VARCHAR(100)

set @DaysToAdd = 10

DECLARE db_cursor CURSOR FOR 
select T.Name, C.Name 
from sys.tables T
join sys.columns C
on T.object_id = C.object_id
and C.system_type_id = 61

OPEN db_cursor  
FETCH NEXT FROM db_cursor INTO @TableName, @ColumnName  

WHILE @@FETCH_STATUS = 0  
BEGIN  
set @UpdateString = 'Update ' + @TableName + ' set ' + @ColumnName + ' = dateadd(dd, ' + cast(@DaysToAdd as varchar) + ', ' + @ColumnName + ') where ...'
exec(@UpdateString)
    FETCH NEXT FROM db_cursor INTO @TableName, @ColumnName  
END  

CLOSE db_cursor  
DEALLOCATE db_cursor

Есть много вещей, которые мне не нравятся в этом: курсор, тот факт, что он за кадром, и вызов exec, и я не уверен, как вы будете «обновлять только тестовые данные», поскольку очень трудно написать предложение where для общей таблицы в вашей базе данных. Но я думаю, что это поможет вам начать.

С другой стороны, возможно, вам стоит подумать о наличии сценария заполнения тестовых данных, который вы можете запустить, чтобы вставить новые данные, удовлетворяющие вашим требованиям к дате.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...