0

テーブルの列の詳細を取得するストア プロシージャがあります。このテーブル名を Invoice テーブルとします。varchar 形式のデータを含む別のテーブル Invoice_Staging テーブルがあります。ここで、Invoice_staging からデータをフェッチし、Invoice テーブルに記載されているデータ型に従って値をキャストし、Invoice テーブルに一括挿入したいと考えています。さて、たまたま、キャストできない値があります。この場合、一括挿入を失敗させたくありません。その特定のフィールドを NULL にして、Invoice テーブルに挿入します。私は、データを取得して必要に応じてキャストすることにこだわっています。私の問題にスポットライトを当てることができる方法を教えてください。ストアドプロシージャは次のとおりです-

create PROCEDURE usp_stagingToProduction
@staging_tableName varchar(200),
@master_tableName varchar(200)  

AS BEGIN SET NOCOUNT ON;

Declare @count int, -- for counting the total number of records in a table 
@RowCount int,
@columnName varchar(200),
@columnDataTypeName varchar(200),
@maxLength int,
@precision int,
@scale int,
@isNullable int,
@primaryKey int,
@sql varchar(5000)
Set @sql = ''

    create table #MyTemporaryTable
    (
        ColumnName varchar(500),
        DataType varchar(100),
        MaxLength int,
        [Precision] int,
        Scale int,
        IsNullable bit,
        PrimaryKey bit,
        flag bit default 0,
        id int identity(1,1)
    )

    insert into #MyTemporaryTable
    SELECT 
            c.name 'ColumnName',
            t.Name 'DataType',
            c.max_length  'MaxLength',
            c.precision 'Precision',
            c.scale 'Scale',
            c.is_nullable 'IsNullable',
            ISNULL(i.is_primary_key, 0) 'PrimaryKey',
            0
        FROM    
            sys.columns c
        INNER JOIN 
            sys.types t ON c.user_type_id = t.user_type_id
        LEFT OUTER JOIN 
            sys.index_columns ic ON ic.object_id = c.object_id AND ic.column_id = c.column_id
        LEFT OUTER JOIN 
            sys.indexes i ON ic.object_id = i.object_id AND ic.index_id = i.index_id
        WHERE
            c.object_id = OBJECT_ID('Invoice')

        -- select * from #MyTemporaryTable  -- To display the content of temporary table


        declare @column varchar(500)
        declare @datatype varchar(500)
        declare @id int
        Set @sql = @sql + 'Insert Into ' + @master_tableName
        Set @sql = @sql + ' Select '
        while exists (select Top 1 * from #MyTemporaryTable where flag  = 0)
        BEGIN
            Select @id = id, @datatype = DataType, @column = ColumnName from #MyTemporaryTable Where flag = 0
            Set @sql = @sql + ' Cast(' + @column + ' As ' + @datatype + '), ' -- building the cast query


            update #MyTemporaryTable
            set flag = 1
            where id = @id

            -- Select @sql -- to see whats happing
        END
        Select @sql = SubString(@sql, 1, LEN(@sql) - 1)
        Set @sql = @sql + ' From' +' ' + @staging_tableName  -- #MyTemporaryTable'

        Select @sql -- just to display query. nothing to do anything with the logic 

        -------------------
        select @count = count(*) from @staging_tableName -- getting column count from staging table
        declare @counter as int
        set @counter = 1
        if(@count >0)
             -- data found in staging table
             -- logic here for casting and inserting the data to the table

        else

エンドゴー

--usp_usp_stagingToProduction '請求書'

4

0 に答える 0