Ciao Lorenzo, ti posto il codice della funzione, che è molto semplice; in pratica gli passi il nome di una tabella e la funzione la ricrea aggiungendo in più la parte di controllo, il punto in cui presenta l'anomalia è quando effettua la concatenazione di stringa delle colonne.
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
ALTER function [dbo].[F_GENERA_CREATE_TABLE] (@tab sysname) returns varchar(8000)
as
/******************************************************************************
** Desc: Genera lo script di creazione tabella
** Versione script: 1.0
** Chiamata da:
**
** Parametri:
** Input Output
** Nome Tabella Campi della tabella
**
** Autore: Stefano di Pace
** Data creaz: 14 maggio 2004
*******************************************************************************
** Storia delle Modifiche
*******************************************************************************
** Data: Autore: Descrizione:
** 14 maggio 2004 Stefano di Pace
** 03 agosto 2005 Marco Fusco Reso dinamico il nome delle colonne
** da creare nella trac e non esistenti
** in quelle di partenza
** 23 ottob 2007 Stefano di Pace Escluse le colonne con datatype text, ntext, image
** 31 ottob 2007 Stefano di Pace Gestione della stringa di ritorno modificata
*******************************************************************************/
Begin
declare @vcStrColumns varchar(6000)
,@vcStrPre varchar(2000)
,@vcRetStrSql varchar(8000)
,@iPrefixPos int
,@vPrefixTbName varchar(50)
set @iPrefixPos = charindex('_',@tab,4)
set @vcStrColumns = ''
if @iPrefixPos = 0
set @vPrefixTbName = @tab+'_'
else
set @vPrefixTbName = left(@tab,@iPrefixPos)
set @vcStrPre = 'if exists (select 1 from information_schema.tables where table_name = ''' + @tab + '_trac''' + ')' + char(13)
set @vcStrPre = @vcStrPre + 'Begin' + char(13)
set @vcStrPre = @vcStrPre + 'drop table ' + 'dbo.'+ @tab + '_trac' + char(13)
set @vcStrPre = @vcStrPre + 'End' + char(13)
set @vcStrPre = @vcStrPre + 'create table ' + 'dbo.'+ @tab + '_trac (' + char(13)
set @vcStrPre = @vcStrPre + @vPrefixTbName + 'trac_id int identity (1,1) primary key,' + char(13)
set @vcStrPre = @vcStrPre + @vPrefixTbName + 'funzio_codice_trac varchar(50),' + char(13)
select @vcStrColumns = @vcStrColumns + column_name + '_trac ' + case data_type
when 'varchar' then data_type + '(' + cast(character_maximum_length as varchar(4)) + '),' + char(13)
when 'nvarchar' then data_type + '(' + cast(character_maximum_length as varchar(4)) + '),' + char(13)
when 'char' then data_type + '(' + cast(character_maximum_length as varchar(4)) + '),'+ char(13)
when 'nchar' then data_type + '(' + cast(character_maximum_length as varchar(4)) + '),'+ char(13)
--when 'text' then data_type + ',' + char(13)
--when 'ntext' then data_type + ',' + char(13)
when 'decimal' then data_type + '(' + cast(numeric_precision as varchar(4)) + ',' + cast(numeric_scale as varchar(4)) + '),'+ char(13)
when 'numeric' then data_type + '(' + cast(numeric_precision as varchar(4)) + ',' + cast(numeric_scale as varchar(4)) + '),'+ char(13)
when 'float' then data_type + '(' + cast(numeric_precision as varchar(4)) + '),'+ char(13)
when 'real' then data_type + '(' + cast(numeric_precision as varchar(4)) + '),'+ char(13)
when 'money' then data_type + ',' + char(13)
when 'smallmoney' then data_type + ',' + char(13)
when 'int' then data_type + ',' + char(13)
when 'bigint' then data_type + ','+ char(13)
when 'tinyint' then data_type + ','+ char(13)
when 'smallint' then data_type + ','+ char(13)
when 'datetime' then data_type + ','+ char(13)
when 'smalldatetime' then data_type + ','+ char(13)
when 'bit' then data_type + ','+ char(13)
else 'ALTRO'
end
from information_schema.tables a
inner join information_schema.columns b on a.table_name = b.table_name
where a.table_type = 'BASE TABLE'
and a.table_name = @tab
/* 23-10-2007 */
and data_type not in ('text','ntext','image')
/* 23-10-2007 */
order by a.table_name, ordinal_position
set @vcStrColumns = @vcStrColumns + @vPrefixTbName + 'tipo_operazione char(1),' + char(13)
set @vcStrColumns = @vcStrColumns + @vPrefixTbName + 'data_last_modify datetime,' + char(13)
set @vcStrColumns = @vcStrColumns + @vPrefixTbName + 'oper_name_last_modify varchar(50)' + char(13)
set @vcRetStrSql = @vcStrPre + @vcStrColumns + ') on TRACE'
return @vcRetStrSql
End
GO
SET ANSI_NULLS OFF
GO
SET QUOTED_IDENTIFIER OFF
GO
Conta che le variabili sono state separate per una questione di leggibilità ma non c'era un particolare bisogno, il risultato non cambia se si utilizza un'unica variabile varchar(8000). La tabella dove ho avuto problemi presenta 105 campi.
Ciao
Marco