cara mendapatkan semua tabel dari database sql server jika ada nama kolom di tabel dan menyimpan data tabel di tabel sementara

Saya mencoba menulis layanan windows, yang akan mengirim email otomatis. semua tabel yang memerlukan pengiriman email memiliki kolom umum 'templateid' dan 'emailstatus'. Saya ingin mengulangi semua tabel dan mendapatkan tabel yang memiliki nama kolom 'templateid'. Sekarang saya memiliki daftar tabel dengan nama kolom 'templateid', dapatkan data dari setiap tabel yang status emailnya 'salah' dan menyimpannya di tabel sementara. jika 'tabel1' memiliki 4 baris data, tabel sementara harus memiliki 4 baris. setelah mengulangi tabel berikutnya, koleksi baris harus ditambahkan ke tabel sementara yang sama.

IF (SELECT object_id('TempDB..#TEMPTABLE')) IS NOT NULL
BEGIN
    DROP TABLE #TEMPTABLE
END
CREATE TABLE #TEMPTABLE(
[ID] INTEGER IDENTITY(1,1) NOT NULL,
[TABLE_NAME] VARCHAR(1000)
)
INSERT INTO #TEMPTABLE(TABLE_NAME)
SELECT TABLE_NAME FROM INFORMATION_SCHEMA.COLUMNS WHERE COLUMN_NAME = 'TEMPLATEID'
SELECT * FROM #TEMPTABLE
DECLARE @ROWCOUNT INT
SET @ROWCOUNT = (SELECT COUNT(ID) FROM #TEMPTABLE) 
DECLARE @I INT
SET @I=1
WHILE(@I<=@ROWCOUNT)
BEGIN
    DECLARE @TABLENAME VARCHAR(500)
        SELECT @TABLENAME=TABLE_NAME FROM #TEMPTABLE WHERE ID=@I
        EXEC('SELECT * FROM '+@TABLENAME)
    SET @I=@I+1
END

saya menemukan kueri di atas yang memberi saya semua tabel. setelah itu saya tidak tahu bagaimana melanjutkannya karena saya tidak mahir dengan sql server.


person Tan    schedule 18.06.2014    source sumber
comment
Kemungkinan besar Anda memerlukan kursor dan mungkin beberapa sql dinamis untuk menyelesaikan pekerjaan ini. Saran saya adalah mundur sejenak dan berpikir logis sejenak. Tanyakan pada diri Anda mengapa Anda tidak menyimpan semua email dalam satu tabel dan jika diperlukan, tautkan ke Id unik untuk setiap email jika diperlukan.   -  person Tanner    schedule 19.06.2014
comment
Menurut saya, Anda perlu menunjukkan sedikit usaha lebih.   -  person Dave Cullum    schedule 19.06.2014
comment
saya mencoba menulis ini dan itu memberi saya informasi setiap tabel. bisakah Anda memberi saya saran jika 'tabel1' memiliki 4 baris data, tabel sementara harus memiliki 4 baris. setelah mengulangi tabel berikutnya, koleksi baris harus ditambahkan ke tabel sementara yang sama. ini bagian dari kebutuhan saya   -  person Tan    schedule 19.06.2014


Jawaban (1)


Tidak yakin Anda masih mencari jawaban tetapi kode berikut akan memberi Anda tabel sementara hanya dengan tabel yang memiliki kolom bernama 'templateid'. Dari sini Anda memerlukan kursor seperti yang disarankan Tanner untuk menelusuri setiap tabel dan kemudian memasukkan catatan dari setiap tabel (ke dalam tabel target akhir Anda) di mana status email = 'false'.

Berikut adalah kode yang memberi Anda tabel temp dengan kolom bernama 'templateid' bersama dengan contoh kursor Anda:

declare @max_tables int
declare @max_columns int
declare @sql nvarchar(400)
declare @x int
declare @y int
declare @table varchar(50)
declare @columns varchar(800)
declare @tablename varchar(100)

create table #c ([Table] varchar(50),[Columns] varchar(800))

select ROW_NUMBER() OVER(ORDER BY name) AS Row, name 
into #table_list
from sys.objects 
where type_desc = 'USER_TABLE' 
order by name

set @max_tables = (select count(*) from sys.objects where type_desc = 'USER_TABLE')
set @y = 0

while @y < @max_tables
    begin
        set @y = @y + 1
        set @table = (select name from #table_list where row = @y)

        create table #t (c int)

        set @sql = 'select count(*) as c from Information_schema.Columns where table_name = ''' + @table + ''''
        insert into #t exec sp_executesql @sql

        set @max_columns = (select top 1 c from #t)

        DROP TABLE #t

        set @x = 0
        set @columns = ''

        while @x < @max_columns 
            begin
                set @x = @x + 1
                set @columns = @columns + (select column_name from Information_schema.Columns where table_name = @table and ordinal_position = @x)
                if @x < @max_columns set @columns = @columns + ', '
            end

        insert into #c select @table,@columns

    end

select * into #tables from #c c
where c.Columns like '%templateid%'

declare my_cursor cursor for
select table from #t

open my_cursor
fetch next from my_cursor into @tablename

while @@fetch_status = 0
begin

     --do something here to retrieve your data from each table and 
     --insert into target table

end

close my_cursor
deallocate my_cursor


DROP TABLE #c,#tables,#table_List
person Brian H    schedule 01.03.2017