2016年1月25日 星期一

{SQL} 產生Script 好好用之「匯出Insert Into Table資料」「匯出Stored Procedure」

因為要做一些文件,需要運用到「把table的資料轉為insert into 語法」與「匯出預存程序」的問題 在此做一個記錄
1.把table的資料轉為insert into 語法
1.1物件總管裡要轉出的Table的資料庫按「右鍵」>「工作」>「產生指令碼」
1.2打開「產生和發佈指令碼」>「下一步」
1.3選取特定的資料庫物件
1.4出現樹狀結溝的樣貌,打開「資料庫」,選擇所要的Table名稱
1.5點擊「下一步」出現指定指令碼的儲存或發行方式
1.6點擊「進階」>「一般」有一個「要編寫指令碼的資料類型」
1.7在「要編寫指令碼的資料類型」中有三個選項
1.7.1僅限資料:只會有insert into 所有Table資料的指令
1.7.2僅限結構(預設):只會有create table 的指令
1.7.3「結構描述和資料」:create table 的指令與insert into 所有Table資料的指令
1.8如果希望拿到指令的人可以先drop table再重新建立table的指令,那在「一般」有一個「編寫DROP和CREATE的指令碼」
1.8.1「編寫CREATE指令碼」(預設):只產出Create指令碼
1.8.2「編寫DROP和CREATE的指令碼」:產出Drop 和Create指令碼
1.8.3「編寫DROP指令碼」:只產出Drop指令碼
1.9接著就是不斷下一步,完成 

2016年1月14日 星期四

{SQL} 單欄資料列取值方式(資料指標-FETCH 迴圈)

逐列處理資料的方式其一Cursor
 DECLARE @temp_addr NVARCHAR(100)=NULL
 DECLARE @temp_zipcode NVARCHAR(10)
 DECLARE @temp_district NVARCHAR(50)
 DECLARE @temp_city NVARCHAR(50)
 DECLARE @temp_IsPostAddr NVARCHAR(1)
 DECLARE @temp_ori NVARCHAR(400)
 DECLARE @data_count INT=0
 SET @temp_ori= dbo.f_AddressMerge(@mail_addr_dis,@mail_road,@mail_lane,@mail_alley,@mail_number_start,@mail_number_end,@mail_floor_start,@mail_floor_end,@mail_room,@mail_remark,@mail_post_name,@mail_postal_address,@mail_lane_l,@mail_alley_l,@mail_hong,@mail_hong_l,@mail_number_start2) ----宣告一個指標
DECLARE  my_cur CURSOR FOR (
--回傳純量函數
         SELECT res from  f_SplitToTable(@temp_ori,',')
        )
--開啟指標
open my_cur
--當指標的狀態為0, 即指標內尚有資料
--如知道資料列中有多少資料,可以用data_count變數來判斷
--WHILE @@fetch_status = 0 AND @data_count<5
WHILE @data_count<5
            BEGIN
--By不同列指定給不同的變數
                SET @data_count=@data_count+1
                IF @data_count='1'
                BEGIN
                FETCH NEXT FROM my_cur INTO @temp_IsPostAddr--,@temp_zipcode,@temp_city,@temp_district,@temp_addr
                END
                IF @data_count='2'
                BEGIN
                FETCH NEXT FROM my_cur INTO @temp_zipcode--@temp_city,@temp_district,@temp_addr
                END
                IF @data_count='3'
                BEGIN
                FETCH NEXT FROM my_cur INTO @temp_city--,@temp_district,@temp_addr
                END
                IF @data_count='4'
                BEGIN
                FETCH NEXT FROM my_cur INTO @temp_district--,@temp_addr
                END
                IF @data_count='5'
                BEGIN
                FETCH NEXT FROM my_cur INTO @temp_addr
                END
            END
--關閉指標
        CLOSE my_cur
--釋放記憶體
        DEALLOCATE my_cur

--方式二 DECLARE @temp_addr NVARCHAR(100)=NULL DECLARE @temp_zipcode NVARCHAR(10) DECLARE @temp_district NVARCHAR(50) DECLARE @temp_city NVARCHAR(50) DECLARE @temp_IsPostAddr NVARCHAR(1) DECLARE @temp_ori TABLE (IsPostAddr nvarchar(1), zipcode nvarchar(6), city nvarchar(20), district nvarchar(20), result nvarchar(300)) DECLARE @data_count INT
--回傳多重式資料表直函式 INSERT INTO @temp_ori(IsPostAddr,zipcode,city,district,result)  
(SELECT * FROM dbo.tf_AddressMerge(@mail_addr_dis,@mail_road,@mail_lane,@mail_alley,@mail_number_start,@mail_number_end,@mail_floor_start,@mail_floor_end,@mail_room,@mail_remark,@mail_post_name,@mail_postal_address,@mail_lane_l,@mail_alley_l,@mail_hong,@mail_hong_l,@mail_number_start2)) SET @data_count=(SELECT COUNT(*) CT FROM @temp_ori) IF @data_count>0 BEGIN SET @temp_IsPostAddr =(SELECT TOP 1 IsPostAddr FROM @temp_ori) SET @temp_zipcode =(SELECT TOP 1 zipcode FROM @temp_ori) SET @temp_city =(SELECT TOP 1 city FROM @temp_ori) SET @temp_district =(SELECT TOP 1 district FROM @temp_ori) SET @temp_addr =(SELECT TOP 1 result FROM @temp_ori) END