문제

나는 단지 이것을 물어 보는 것만으로 생각하지만 Google의 도움을받지 못했고 SMO에 대한 간단한 검색에 대한 So의 결과를 모두 보냈으며 그것을 보지 못했습니다.

짧은 버전은 내가 T4와 함께 놀기 시작한다는 것입니다. 나는 확장하고있다 Oleg Sych의 초기 튜토리얼 모든 테이블에 열거를 제공하여 (IMHO 다소 어리석은) 삭제 Proc. 이것은 단지 실험 일 뿐이므로, 그 전적으로 쓸모없는 것은 나를 괴롭히지 않습니다. :)

Oleg의 튜토리얼로의 확장은 다음과 같습니다.

<#@ template language="C#" hostspecific="true" #>
<#@ output extension="SQL" #>
<#@ assembly name="Microsoft.SqlServer.ConnectionInfo" #>
<#@ assembly name="Microsoft.SqlServer.Smo" #>
<#@ import namespace="Microsoft.SqlServer.Management.Smo" #>
<#@ include file="T4Toolbox.tt" #>
<#
    // Config variables
    string serverName = "dbserver\\dbinstance";
    string dbName = "dbname";
#>
USE <#= dbName #>
<#  
    // Iterate over tables and generate procs
    Server server = new Server(serverName);
    Database database = new Database(server, dbName);

    WriteLine("/* Number of tables: " + database.Tables.Count.ToString() + " */");

    foreach (Table table in database.Tables)
    {
        table.Refresh();
#>
CREATE PROCEDURE <#= table.Name #>_Delete
<#
        PushIndent("    ");
        foreach (Column column in table.Columns)
        {
            if (column.InPrimaryKey)
                WriteLine("@" + column.Name + " " + column.DataType.Name);
        }
        PopIndent();
#>
AS
    DELETE FROM 
        <#= table.Name #>
    WHERE
<#
        PushIndent("        ");
        foreach (Column column in table.Columns)
        {
            if (column.InPrimaryKey)
                WriteLine(column.Name + " = @" + column.Name);
        }
        PopIndent();
        WriteLine("GO");
    }
#> 

문제는 테이블이 Tables 수집. 이것은 내가 생성하는 테이블 수 SQL 주석으로 검증됩니다. 0.

작성된대로 위의 코드는 다음을 생성합니다.

USE dbname
/* Number of tables: 0 */

그러나 For Loop을 제거 하고이 데이터베이스에 존재하는 유효한 테이블 이름을 수동으로 제공하면 해당 테이블의 (다시 바보) Proc를 생성합니다.

테이블이 스키마로 분리되어 있습니다. 그게 중요합니까? 또한 이것은 SQL2005 인스턴스에 위배됩니다. 잠재적으로 문제가 발생할 수 있습니까?

마지막으로, 나는 또한 동의어 컬렉션을 통해 동의어를 열거 할 수 없다는 것을 알게되었습니다. (테이블이 스키마에 있지만 동의어가 정의 된 이후로 영리하다고 생각하고 경로를 갈 것입니다. 그러나 ... 주사위는 없습니다.)

다시 말하지만, 위의 코드는 자연스럽게 생산이 아니며 생산에 합당하지 않습니다. 나는 단지 T4와 SMO를 모두 배우려고 노력하고 있으며, 엄청나게 간단 할 것이라고 생각한 일을하려고 노력하고 있습니다. :)

도움이 되었습니까?

해결책

SMO는 데이터베이스 클래스의 새 인스턴스를 작성하는 경우 메타 데이터를 자동으로 검색하지 않습니다. 메타 데이터를 검색하는 데는 특히 추운 환경에서 시간이 걸릴 수 있습니다. 루프 전에 database.refresh ()를 호출하십시오.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top