0

結果セットを一時テーブルに保存しました。

Column_Name, Data_Type, Default_Value
Col1         varchar      abc
Col2         varchar      abc
Col3         int          999
Col4         decimal      0.0
Col5         datetime     20120101

次に、列名をテーブルの列名と比較し、一時テーブルのデータ型に基づいて、列値がNULLの場合は常にデフォルト値を割り当てるステートメントを作成する必要があります。

私にはそれを行う方法がわかりません

これは私が今までやってきたことです

  CREATE TABLE #ColumnData (Column_Name varchar(500), Data_Type varchar(20),

Default_Value varchar(50))

 DECLARE @query1 NVARCHAR(MAX) = '' 
  DECLARE @SchemaName VARCHAR(20)
  DECLARE @TableName VARCHAR(50)

SET @SchemaName = 'dbo'
SET @TableName = 'tblCustomer'





     select @query1 = @query1 + 'UPDATE ' + @schemaName + '.' + @tableName + ' SET ' + 
     c.COLUMN_NAME + ' = ' + c.Default_Value+ ' WHERE ' +   c.COLUMN_NAME 
     + ' = ''NULL'';' FROM #ColumnData c  
     WHERE C.TABLE_NAME = @tableName     

      EXECUTE sp_executesql @query1 
4

1 に答える 1

1

これでうまくいくはずです。SQL2008でテストしました。

update t
set t.col1 = isnull(t.col1, tr.col1) 
    t.col2 = isnull(t.col1, tr.col2)
    etc.
from my_table t
cross join temp_table tr

アップデート:

--このように一時テーブルを作成してから、すべてのデフォルト値を1行に設定します(_temp一時テーブル名の末尾にあることに注意してください)。

select * into #MyTable_temp from dbo.MyTable where 1=1

DECLARE @query NVARCHAR(MAX) = 'update t set ' 
DECLARE @SchemaName VARCHAR(20) 
DECLARE @TableName VARCHAR(50) 

SET @SchemaName = 'dbo' 
SET @TableName = 'MyTable' 

set @query = @query + ( 
        select stuff((
            select ', ' + c.column_name + ' = isnull(t.' + c.column_name + ', tt.' + c.column_name + ')'
            from INFORMATION_SCHEMA.COLUMNS c
            where c.TABLE_NAME = @TableName
            for xml path('')), 1, 2, ''))

set @query = @query + ' from ' + @SchemaName + '.' + @TableName + ' t cross join #' + @TableName + '_temp tt'

select @query

クエリは次のようになります。

update t 
    set Col1 = isnull(t.Col1, tt.Col1), 
        Col2 = isnull(t.Col2, tt.Col2), 
        Col3 = isnull(t.Col3, tt.Col3), 
        Col4 = isnull(t.Col4, tt.Col4), 
        etc... 
from dbo.MyTable t 
cross join #MyTable_temp tt
于 2012-09-15T15:31:30.503 に答える