한개의 서버안에 구조가 동일한 데이터베이스가 100개정도가 있는데요.
프로시저 한개를 100개의 데이터베이스안에 모두 컴파일 하려고 합니다.
FUNCTION 생성문장을 100번 날리면 되겠지만,
유지보수하려면 수정도 많고 해서, 매번 그렇게 할 수는 없고
다이나믹 쿼리로 하는 방법이 없을 까요?
제가 다이나믹으로 아래와 같이 테스트를 해보니...
.
.
@SQL = 'USE ' + @DATABASE + ' GO '
@SQL = @SQL + 'CREATE FUNCTION... '
.
.
위와 같이 테스트 해보면...
"CREATE FUNCTION'은(는) 쿼리 일괄 처리에서 첫 번째 문이어야 합니다." 라는 오류가 뜹니다.
Comment 4
-
쓸만한게없네(윤선식)
2013.07.08 22:30
-
방울소리007
2013.07.09 11:30
DECLARE @TEMP VARCHAR(MAX)
SET @TEMP =
'
DECLARE @SQL NVARCHAR(MAX)
Set @SQL = ''USE [NPAS_ORGTEST_ACC];'' + CHAR(13) + CHAR(10)
Set @SQL = @SQL + ''CREATE FUNCTION [dbo].[uf_test]()'' + CHAR(13) + CHAR(10)
Set @SQL = @SQL + ''RETURNS int'' + CHAR(13) + CHAR(10)
Set @SQL = @SQL + ''AS'' + CHAR(13) + CHAR(10)
Set @SQL = @SQL + ''BEGIN'' + CHAR(13) + CHAR(10)
Set @SQL = @SQL + '' RETURN 1'' + CHAR(13) + CHAR(10)
Set @SQL = @SQL + ''END''
EXEC (@SQL)
'
EXEC (@TEMP)이런식으로 기술하라는 건가요?
이렇게 해도 마찬가지 아래와 같은 오류가 뜨는데요?
메시지 111, 수준 15, 상태 1, 줄 2
'CREATE FUNCTION'은(는) 쿼리 일괄 처리에서 첫 번째 문이어야 합니다.
메시지 178, 수준 15, 상태 1, 줄 6
이 컨텍스트에서는 반환 값이 있는 RETURN 문을 사용할 수 없습니다. -
눈을뜨자
2013.07.09 12:14
서버단에서 쿼리 분석기 창을 열고 sp_msforeachdb 를 사용해보세요
예를 들어 sp_msforeachdb 'print ''use ? ''' 이렇게 하시면 하나의 인스턴스에 있는 DB가 나 나올 껍니다.
그걸 이용하시면 될듯 한데요...
-
방울소리007
2013.07.09 18:20
답변 주신 분들 모두 감사합니다.
눈을뜨자님이 힌트 주신걸로 아래와 같이 테스트 해보니 잘 됩니다.
다시 한번 감사드립니다.^^
EXEC sp_MSforeachDB 'IF ''?'' in (''test_db1'',''test_db2'')
begin
use ?
declare @sql varchar(max)
set @sql = ''CREATE FUNCTION DBO.uf_test()'' + char(13) + char(10)
set @sql = @sql + ''returns int'' + char(13) + char(10)
set @sql = @sql + ''as'' + char(13) + char(10)
set @sql = @sql + ''begin'' + char(13) + char(10)
set @sql = @sql + '' return 1'' + char(13) + char(10)
set @sql = @sql + ''end''
exec(@sql)
end
'
EXEC 로 한 번 더 싸 보세요.
http://www.sqler.com/521219