วิธีรับตารางทั้งหมดจากฐานข้อมูลเซิร์ฟเวอร์ sql หากมีชื่อคอลัมน์อยู่ในตารางและบันทึกข้อมูลตารางในตารางชั่วคราว

ฉันกำลังพยายามเขียนบริการ windows ซึ่งจะส่งอีเมลอัตโนมัติ ตารางทั้งหมดที่ต้องส่งอีเมลจะมีคอลัมน์ 'templateid' และ 'emailstatus' ทั่วไป ฉันต้องการวนซ้ำตารางทั้งหมดและรับตารางที่มีชื่อคอลัมน์ 'templateid' ตอนนี้ฉันมีรายการตารางที่มีชื่อคอลัมน์ 'templateid' รับข้อมูลจากแต่ละตารางที่มีสถานะอีเมลเป็น 'เท็จ' และบันทึกไว้ในตารางชั่วคราว ถ้า 'table1' มีข้อมูล 4 แถว ตารางชั่วคราวก็ควรมี 4 แถว หลังจากวนซ้ำตารางถัดไปแล้ว ควรเพิ่มคอลเลกชันแถวลงในตารางชั่วคราวเดียวกัน

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

ฉันพบข้อความค้นหาข้างต้นซึ่งให้ตารางทั้งหมดแก่ฉัน หลังจากนั้นฉันก็ไม่รู้ว่าจะดำเนินการต่อไปอย่างไร เนื่องจากฉันไม่เก่งกับเซิร์ฟเวอร์ sql


person Tan    schedule 18.06.2014    source แหล่งที่มา
comment
คุณมีแนวโน้มที่จะต้องใช้เคอร์เซอร์และอาจมีไดนามิก sql เพื่อให้งานนี้สำเร็จ คำแนะนำของฉันคือถอยกลับไปและคิดอย่างมีเหตุผลสักครู่ ถามตัวเองว่าทำไมคุณไม่เก็บอีเมลทั้งหมดไว้ในตารางเดียว และหากจำเป็น ให้ลิงก์ไปยังรหัสเฉพาะสำหรับอีเมลแต่ละฉบับ หากจำเป็น   -  person Tanner    schedule 19.06.2014
comment
ฉันคิดว่าคุณต้องแสดงความพยายามมากกว่านี้หน่อย   -  person Dave Cullum    schedule 19.06.2014
comment
ฉันลองเขียนสิ่งนี้แล้วมันก็ให้ข้อมูลแต่ละตารางแก่ฉัน คุณช่วยแนะนำหน่อยได้ไหมว่า 'table1' มีข้อมูล 4 แถว ตารางชั่วคราวควรมี 4 แถว หลังจากวนซ้ำตารางถัดไปแล้ว ควรเพิ่มคอลเลกชันแถวลงในตารางชั่วคราวเดียวกัน ส่วนนี้ของความต้องการของฉัน   -  person Tan    schedule 19.06.2014


คำตอบ (1)


ไม่แน่ใจว่าคุณยังคงมองหาคำตอบอยู่ แต่รหัสต่อไปนี้จะให้ตารางชั่วคราวโดยมีเพียงตารางที่มีคอลัมน์ชื่อ 'templateid' จากที่นี่ คุณจะต้องมีเคอร์เซอร์ตามที่ Tanner แนะนำให้วนซ้ำแต่ละตาราง จากนั้นแทรกบันทึกจากแต่ละตาราง (ลงในตารางเป้าหมายสุดท้ายของคุณ) โดยที่สถานะอีเมล = 'false'

นี่คือโค้ดที่ทำให้คุณได้รับตารางชั่วคราวที่มีคอลัมน์ชื่อ 'templateid' พร้อมด้วยตัวอย่างสำหรับเคอร์เซอร์ของคุณ:

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