#142 - Ricavare le stringhe INSERT con una Stored Procedures in SQL Server 7.0

Spesso capita di dover caricare dei record in una tabella SQL Server 7.0 prelevandoli da un altro database.

L'operazione puo' essere eseguita con il comando BCP, ma vi sono casi dove conviene non utilizzare questo comando. Ad esempio se i record da caricare non sono molti o se non si puo' disporre di un file di appoggio all'interno del quale scaricare il dump della tabella generato con il BCP.

Per questo ho realizzato una stored procedure che prende in input il nome della tabella e come output genera tante righe di INSERT quanti sono i record contenuti nella tabella.

--------------------
Create procedure GeneraInsert
@TableName nvarchar(255)
AS
set nocount on
declare @ColumnName varchar(8000)
      , @ColumnType nvarchar(255)
      , @ColOrder int
      , @ExecStr varchar(8000)
      , @HeadStr varchar(8000)
      , @MaxCol int
      , @ColList bit

set @ColList = 1
set @HeadStr = '('
select @MaxCol =  MAX(ORDINAL_POSITION) from INformation_schema.columns
WHERE Table_Name=@TableName

declare ColumnList cursor scroll for
select COLUMN_NAME,DATA_TYPE,ORDINAL_POSITION from
information_schema.columns
WHERE Table_Name=@TableName ORDER BY ORDINAL_POSITION

open ColumnList
fetch first
  from ColumnList
into @ColumnName, @ColumnType, @ColOrder
while @@fetch_status <> -1
begin
    set @HeadStr = @HeadStr +
                  case when @ColOrder < @MaxCol then @ColumnName + ', '
                      else @ColumnName + ')'
                        end

    fetch next
    from ColumnList
    into @ColumnName, @ColumnType, @ColOrder
end

if @ColList = 1
  set @ExecStr = 'SELECT ''INSERT INTO ' + @TableName + ' ' + @HeadStr + '
VALUES ('' + '
else
  set @ExecStr = 'SELECT ''INSERT INTO ' + @TableName + ' VALUES ('' + '

fetch first
  from ColumnList
into @ColumnName, @ColumnType, @ColOrder

while @@fetch_status <> -1
begin

    set @ExecStr = @ExecStr +
                  case when @ColumnType in ('tinyint', 'bit', 'smallint',
'int', 'money') then 'convert(varchar, ' + @ColumnName + ')'
                      when @ColumnType in ('datetime') then ''''''''' +
replace(convert(varchar, ' + @ColumnName + ', 102), ''.'', '''') + '''''''''

                      else '''N'' + '''''''' + ' +'replace(' + @ColumnName
+ ', '''''''', '''''''''''') + '''''' '''
                        end +
                  case when @ColOrder < @MaxCol then '+ '',''+'
                      else ' + '')'' FROM ' + @TableName
                        end
    fetch next
    from ColumnList
    into @ColumnName, @ColumnType, @ColOrder
end

deallocate ColumnList

-- Visualizzazione della stringa che genera le INSERT
select @Execstr
-- Visualizzazione delle stringhe di INSERT
exec (@Execstr)
---------------------------------------


Approfondimenti

Commenti

Esprimi il tuo giudizio su questo script:

Per procedere devi essere autenticato.

Per inserire un commento, devi registrarti alla nostra community.




IN EVIDENZA
MISC