Вы можете использовать osql или лучше, но более новый sqlcmd почти взаимозаменяемо. Я использую osql в этом примере только потому, что у меня получился пример кода, но в работе я использую sqlcmd. Вот фрагмент кода из более крупной процедуры, которую я использую для запуска сценариев обновления для баз данных. Они упорядочены по основным, второстепенным версиям и сборкам, так как я называю свои сценарии, используя это соглашение для отслеживания выпусков. Вы, очевидно, упускаете все мои сообщения об ошибках, части, в которых я извлекаю доступные скрипты из базы данных, переменные установки и т. Д., Но вы все равно можете найти этот фрагмент полезным.
Основная часть, которая мне нравится в использовании osql или sqlcmd, заключается в том, что вы можете запустить этот код в ssms, или в хранимой процедуре (может быть вызвана по расписанию) или из пакетного файла. Очень гибкий.
--Use cursor to run upgrade scripts
DECLARE OSQL_cursor CURSOR
READ_ONLY
FOR SELECT FileName
FROM #Scripts
ORDER BY Major, Minor, Release, Build
OPEN OSQL_cursor
FETCH NEXT FROM OSQL_cursor INTO @name
WHILE (@@fetch_status <> -1)
BEGIN
IF ((@@fetch_status <> -2) AND (@result = 0))
BEGIN
SET @CommandString = 'osql -S ' + @@ServerName + ' -E -n -b -d ' + @DbName + ' -i "' + @Dir + @name + '"'
EXEC @result = master.dbo.xp_cmdshell @CommandString, NO_OUTPUT
IF (@result = 0)
BEGIN
SET @Seconds = DATEDIFF(s, @LastTime, GETDATE())
SET @Minutes = @Seconds / 60
SET @Seconds = @Seconds - (@Minutes * 60)
PRINT 'Successfully applied ' + @name + ' in ' + cast(@Minutes as varchar)
+ ' minutes ' + cast(@Seconds as varchar) + ' seconds.'
SET @LastTime = GETDATE()
END
ELSE
BEGIN
SET @errMessage = 'Error applying ' + @name + '! The database is in an unknown state and the schema may not match the version.'
SET @errMessage = @errMessage + char(13) + 'To find the error restore the database to version ' + @StartingVersion
SET @errMessage = @errMessage + ', set @UpToVersion = the last version successfully applied, then run ' + @name
SET @errMessage = @errMessage + ' manually in Query Analyzer.'
END
IF @name = (@UpToVersion + '.sql')
GOTO CleanUpCursor --Quit if the final script specified has been run.
END
FETCH ENDT FROM OSQL_cursor INTO @name
END