2011-10-06 3 views
2

SMO를 사용하여 T-SQL에서 쉽게 수행 할 수없는 몇 가지 작업을 수행하고 싶습니다. 그러나, 내가 찾은 모든 예제는 C# 또는 Powershell을위한 것입니다. DMO 및 sp_OACreate과 같이 T-SQL을 통해 SMO를 호출하는 쉬운 방법이 있습니까? 한 가지 방법은 xp_cmdshell을 통해 PowerShell을 통해 SMO를 호출하는 것이지만 추한 것입니다. 제안?T-SQL을 통해 SMO 호출?

명백한 예는 SQL을 통해 호출되는 "SMO를 사용하는 테이블을 통한 스크립트"입니다.

감사합니다.

+0

구체적으로 무엇을하려합니까? SMO에서와 마찬가지로 T-SQL에서도 쉽게 수행 할 수 있습니다. – siride

+0

@siride 스트레이트 T-SQL에서 모든 작업을 수행 할 수 있지만 스크립팅 객체는 SMO를 사용하면 약간 쉬울 수 있습니다. [Scripter] (https://msdn.microsoft.com/en-us/library/microsoft.sqlserver.management.smo.scripter.aspx)와 [ScriptingOptions] (https://msdn.microsoft.com/en)를 확인하십시오. -us/library/microsoft.sqlserver.management.smo.scriptingoptions.aspx). –

+1

@srutzky : 나는 그것들을 사용했고 그들은 (대단히) 훌륭합니다. 그래도 C# 도구를 써서이 작업을 수행해야한다면 어떨까요? T-SQL을 통해 수행해야하는 이유는 무엇입니까? – siride

답변

3

아쉽게도 SMO는 SQLCLR을 통해 직접 호출 할 수 없습니다. 뿐만 아니라 - Microsoft.SqlServer.Smo.dll - Supported .NET Framework Libraries 목록에 없지만 특별히 허용되지 않습니다. 원하는 기능을 래핑하는 사용자 어셈블리를 만들어 "

Msg 6596, Level 16, State 1, Line 1
CREATE ASSEMBLY failed because assembly 'Microsoft.SqlServer.Smo' is a system assembly. Consider creating a user assembly to wrap desired functionality.

좋아, 그래서 시도 :

CREATE ASSEMBLY [SMO] 
AUTHORIZATION [dbo] 
FROM 
N'C:\Program Files\Microsoft SQL Server\110\SDK\Assemblies\Microsoft.SqlServer.Smo.dll' 
WITH PERMISSION_SET = UNSAFE; 

반환 값 : 수동 CREATE ASSEMBLY를 통해 그 DLL을 가져 오려고하면

, 다음과 같은 오류를 얻을 수 ". 난 그냥,

그리고 : 어셈블리가 PERMISSION_SET = UNSAFE 표시되어 있으면 당신이 얻을

Msg 6522, Level 16, State 2, Line 1
A .NET Framework error occurred during execution of user-defined routine or aggregate "SmoTest":
System.Security.SecurityException: That assembly does not allow partially trusted callers.

을 :

Msg 6522, Level 16, State 2, Line 1
A .NET Framework error occurred during execution of user-defined routine or aggregate "SmoTest":
System.Exception: This functionality is disabled in the SQLCLR. It is recommended that you execute from your client application.
System.Exception:
at Microsoft.SqlServer.Management.Common.ConnectionManager..ctor()
at Microsoft.SqlServer.Management.Smo.Server..ctor()

UPDATE를 어셈블리가 PERMISSION_SET = SAFE 표시되어 있으면

당신은 얻을 2007 년 1 월 MSDN 포럼에서 관련 스레드 발견 :

'microsoft.sqlserver.batchparser' is malformed or not a pure .NET assembly.

+1

어셈블리를 디 컴파일하지 않고 VS에서 새 어셈블리 집합으로 다시 컴파일 한 다음 SQLCLR을 통해 실행 했습니까? 나는 너가 충분히 멀리 갔다고 생각하지 않는다. – siride

+0

@siride 좋아, 그래서 그냥 (조금) 시도하고 [ILSpy] (http://ilspy.net/)를 통해 소스를 가지고 있지만 모든 네임 스페이스 참조를 업데이트 할 시간이 없어 그리고/또는 뭐든간에 그렇지 않으면 필요합니다. 오, 그럼, 시도 할 시간이 있다면 어쩌면? ;-) –

관련 문제