2016-07-20 10 views
0

Wie kann ich folgenden Code ohne while-Schleife schreiben? Gibt es einen alternativen Weg, um while-Schleife in diesem Fall zu vermeiden?alternative Lösung für while-Schleife in sql

SELECT @count = COUNT(*) from CommonTables 

While(@count > 0) 
BEGIN 
select top 1 @Sname = Schema_name,@Tname = Name from CommonTables 


SET @sql = '' 
SET @sql = 'insert into #Temp1 select '''[email protected]+''','''[email protected]+''',column_name,data_type,character_maximum_length FROM '[email protected]+'.information_schema.columns 
WHERE table_name = '''[email protected]+''' and TABLE_SCHEMA = '''[email protected]+'''' 

EXEC SP_EXECUTESQL @SQL 

SET @sql = '' 
SET @sql = 'insert into #Temp2 select '''[email protected]+''','''[email protected]+''',column_name,data_type,character_maximum_length FROM '[email protected]+'.information_schema.columns 
WHERE table_name = '''[email protected]+''' and TABLE_SCHEMA = '''[email protected]+'''' 

EXEC SP_EXECUTESQL @SQL 

DELETE from CommonTables where Name = @Tname and Schema_name = @Sname 

SELECT @count = COUNT(*) from CommonTables 

END 

Hier CommonTables enthalten Liste der Tabellen, die in 2 Datenbanken gemeinsam sind (DB1 und DB2)

Antwort

0

nicht Schleife brauchen überhaupt.

select @sql = isnull(@sql, '') 
     + N'INSERT INTO #Temp1 ' 
     + N'SELECT table_schema, table_name,column_name,data_type,character_maximum_length ' 
     + N'FROM ' + QUOTENAME(@DB1) + '.INFORMATION_SCHEMA.COLUMNS ' 
     + N'WHERE table_name = ''' + Name + ''' and TABLE_SCHEMA = ''' + Schema_name + ''';' + char(13) 
from CommonTables 

print @sql 
exec sp_executesql @sql 

Wenn Sie möchten, brauchen Sie keine separate sp_execute-Anweisung für 2 DB. Sie können

in einem einzigen Sp_execute kombinieren und hier ist die Abfrage

select @sql = isnull(@sql, '') 
     + N'insert into ' + db.temptbl + ' ' 
     + N'SELECT TABLE_SCHEMA,TABLE_NAME,COLUMN_NAME,DATA_TYPE,CHARACTER_MAXIMUM_LENGTH ' 
     + N'FROM ' + QUOTENAME(db.dbname) + '.INFORMATION_SCHEMA.COLUMNS ' 
     + N'WHERE TABLE_NAME = ''' + Name + ''' AND TABLE_SCHEMA = ''' + Schema_name + ''';' + char(13) 
from CommonTables 
     cross join 
     (
      select temptbl = '#Temp1', dbname = 'DB1' union all 
      select temptbl = '#Temp2', dbname = 'DB2' 
     ) db 

print @sql 
exec sp_executesql @sql 
+0

Vielen Dank :) Es funktioniert gut –

Verwandte Themen