Dùng Select * Into trong SQL

Các mẹo vặt linh tinh không thuộc các nhóm trên

Các điều hành viên: tungcan5diop, QUANITGROBEST

Đăng trả lời
Hình đại diện của thành viên
tungcan5diop
Cựu chiến binh
Cựu chiến binh
Bài viết: 1123
Ngày tham gia: Thứ 4 24/09/2008 4:04 pm
Đến từ: TPHCM
Has thanked: 1 time
Been thanked: 27 times

Dùng Select * Into trong SQL

Gửi bài by tungcan5diop »

Thủ thuật: Dùng Select * Into trong SQL
Tác giả: tungcan5diop
Mô tả: như trên
chắc các bạn đã biết lệnh
1.

Mã: Chọn tất cả

SELECT * INTO [Tbl_A] FROM [Tbl_B]
tạo một bảng giống cấu trúc và dữ liệu so với bảng ban đầu
lệnh trên khác với lệnh
2.

Mã: Chọn tất cả

INSERT INTO [Tbl_A] SELECT * FROM [Tbl_B]
lệnh 2 cần điều kiện là 2 bảng cần giống nhau về cấu trúc

rõ ràng lệnh 1. xài tiện hơn 2. nhưng vấn đề là những table ta copy từ lệnh 1. nó đã làm mất đi một số properties quan trọng :khóa chính(quan trọng khi xài SQLDataAdapter) không thấy,Default Value không còn,...nếu bạn nào đã từng làm VBA thì sẽ biết rằng tầm quan trọng khi tạo bảng tạm..khi mình chuyển code từ VBA sang VB.net đã vướng phải vấn đề bảng tạm..nhu cầu tạo bảng tạm rất nhiều..nếu xài 1. thì mất khoá chính...không lẽ mở mấy chục cái Table để set khoá chính cho nó...
hàm sau đây

Mã: Chọn tất cả

    Sub copy(ByVal OldTable As String, ByVal NewTable As String)        Dim sql As String = ""        Dim sFirst As String = ""        Dim sEnd As String = ""        sql += "IF OBJECT_ID('" + NewTable + "') IS NOT NULL"        sql += " DROP TABLE " + "[" & NewTable & "]" + ";"        sql += "select * into " & "[" & NewTable & "]" & " from " & "[" & OldTable & "]" & " where 1=2;"        DoCmdRunSQL(sql)        Dim dt As New DataTable        sFirst += " select INFORMATION_SCHEMA.COLUMNS.[COLUMN_NAME],INFORMATION_SCHEMA.COLUMNS.[IS_NULLABLE]," & ControlChars.NewLine        sFirst += " INFORMATION_SCHEMA.COLUMNS.[DATA_TYPE], INFORMATION_SCHEMA.COLUMNS.[CHARACTER_MAXIMUM_LENGTH]" & ControlChars.NewLine        sFirst += " from INFORMATION_SCHEMA.COLUMNS" & ControlChars.NewLine        sFirst += " where table_name='" + OldTable + "' and INFORMATION_SCHEMA.COLUMNS.[COLUMN_NAME] in" & ControlChars.NewLine        sFirst += " (" & ControlChars.NewLine        sFirst += " select a.COLUMN_NAME from INFORMATION_SCHEMA.KEY_COLUMN_USAGE a" & ControlChars.NewLine        sFirst += " inner join INFORMATION_SCHEMA.TABLE_CONSTRAINTS b" & ControlChars.NewLine        sFirst += " on a.CONSTRAINT_NAME = b.CONSTRAINT_NAME" & ControlChars.NewLine        sFirst += " where a.table_name = '" + OldTable + "'" & ControlChars.NewLine        sFirst += " and constraint_type = 'Primary key'" & ControlChars.NewLine        sFirst += " ) " & ControlChars.NewLine         Dim row() As DataRow        SelectQuery(sFirst, dt)        row = dt.Select        Dim arr As New ArrayList        If row.Length > 0 Then            For i As Integer = 0 To row.Length - 1                arr.Add(row(i)("COLUMN_NAME"))            Next        End If         '--xóa constraint trứơc khi add        '        IF EXISTS (SELECT * FROM sysobjects WHERE name = 'pk_E_phieu nhap-007')        '            BEGIN        'ALTER TABLE [E_phieu nhap-007]        'DROP CONSTRAINT [pk_E_phieu nhap-007]         'alter table [E_phieu nhap-007] add constraint [pk_E_phieu nhap-007]         'primary key clustered([SOCT],[NEWID])        '            End               '------------------------set khóa chính        If arr.Count = 1 Then            sEnd += " alter table " & "[" & NewTable & "]" & " add constraint " & "[" & "pk" & "_" & NewTable & "]" & " primary key clustered([" + arr(0) + "]) "        End If        If arr.Count = 2 Then            sEnd += " alter table " & "[" & NewTable & "]" & " add constraint " & "[" & "pk" & "_" & NewTable & "]" & " primary key clustered([" + arr(0) + "],[" + arr(1) + "]) "        End If        If arr.Count = 3 Then            sEnd += " alter table " & "[" & NewTable & "]" & " add constraint " & "[" & "pk" & "_" & NewTable & "]" & " primary key clustered([" + arr(0) + "],[" + arr(1) + "],[" + arr(2) + "]) "        End If        If arr.Count = 4 Then            sEnd += " alter table " & "[" & NewTable & "]" & " add constraint " & "[" & "pk" & "_" & NewTable & "]" & " primary key clustered([" + arr(0) + "],[" + arr(1) + "],[" + arr(2) + "],[" + arr(3) + "]) "        End If        If arr.Count = 5 Then            sEnd += " alter table " & "[" & NewTable & "]" & " add constraint " & "[" & "pk" & "_" & NewTable & "]" & " primary key clustered([" + arr(0) + "],[" + arr(1) + "],[" + arr(2) + "],[" + arr(3) + "],[" + arr(4) + "]) "        End If        If arr.Count = 6 Then            sEnd += " alter table " & "[" & NewTable & "]" & " add constraint " & "[" & "pk" & "_" & NewTable & "]" & " primary key clustered([" + arr(0) + "],[" + arr(1) + "],[" + arr(2) + "],[" + arr(3) + "],[" + arr(4) + "],[" + arr(5) + "]) "        End If        If arr.Count = 7 Then            sEnd += " alter table " & "[" & NewTable & "]" & " add constraint " & "[" & "pk" & "_" & NewTable & "]" & " primary key clustered([" + arr(0) + "],[" + arr(1) + "],[" + arr(2) + "],[" + arr(3) + "],[" + arr(4) + "],[" + arr(5) + "],[" + arr(6) + "]) "        End If        Try            If sEnd <> "" Then                If DoCmdRunSQL(sEnd) = True Then                End If            End If                    Catch ex As Exception            MessageBox.Show("ERROR" & ControlChars.NewLine & ex.Message)        End Try           '-------------------set default value        Dim sdf As String = ""        Dim def As String = ""        sdf += " select table_name,column_name,column_default,data_type from INFORMATION_SCHEMA.COLUMNS "        sdf += " where TABLE_NAME='" + OldTable + "'"        sdf += " and COLUMN_DEFAULT is not null"        Dim mydt As New DataTable        SelectQuery(sdf, mydt)        Dim myrow() As DataRow        myrow = mydt.Select        'alter table [e_phieu nhap CT-007] add constraint default_value default 0 for TTVON        If myrow.Length > 0 Then            For j As Integer = 0 To myrow.Length - 1                def += " alter table " & "[" & NewTable & "]" & " add constraint default_value_" & NewTable & "_" & j + 1 & "" & " DEFAULT " _                & myrow(j)("column_default") & " for " & myrow(j)("column_name") & ControlChars.NewLine            Next        End If        Try            If def <> "" Then                DoCmdRunSQL(def)            End If         Catch ex As Exception            MessageBox.Show("ERROR" & ControlChars.NewLine & ex.Message)        End Try        MessageBox.Show("Chuyển thành công")    End Sub 
hàm trên khá dài nhưng ko sao mình sẽ comment :)

Mã: Chọn tất cả

  sql += "IF OBJECT_ID('" + NewTable + "') IS NOT NULL"        sql += " DROP TABLE " + "[" & NewTable & "]" + ";"        sql += "select * into " & "[" & NewTable & "]" & " from " & "[" & OldTable & "]" & " where 1=2;"'--chắc rằng ko tồn tại Table nào với tên như vậy        DoCmdRunSQL(sql)'--chắc rằng ko tồn tại Table nào với tên như vậy         Dim dt As New DataTable        sFirst += " select INFORMATION_SCHEMA.COLUMNS.[COLUMN_NAME],INFORMATION_SCHEMA.COLUMNS.[IS_NULLABLE]," & ControlChars.NewLine        sFirst += " INFORMATION_SCHEMA.COLUMNS.[DATA_TYPE], INFORMATION_SCHEMA.COLUMNS.[CHARACTER_MAXIMUM_LENGTH]" & ControlChars.NewLine        sFirst += " from INFORMATION_SCHEMA.COLUMNS" & ControlChars.NewLine        sFirst += " where table_name='" + OldTable + "' and INFORMATION_SCHEMA.COLUMNS.[COLUMN_NAME] in" & ControlChars.NewLine        sFirst += " (" & ControlChars.NewLine        sFirst += " select a.COLUMN_NAME from INFORMATION_SCHEMA.KEY_COLUMN_USAGE a" & ControlChars.NewLine        sFirst += " inner join INFORMATION_SCHEMA.TABLE_CONSTRAINTS b" & ControlChars.NewLine        sFirst += " on a.CONSTRAINT_NAME = b.CONSTRAINT_NAME" & ControlChars.NewLine        sFirst += " where a.table_name = '" + OldTable + "'" & ControlChars.NewLine        sFirst += " and constraint_type = 'Primary key'" & ControlChars.NewLine        sFirst += " ) " & ControlChars.NewLine   '--select tất cả các khoá chình của Table(gốc) ban đầu        SelectQuery(sFirst, dt)

Mã: Chọn tất cả

   Dim arr As New ArrayList        If row.Length > 0 Then            For i As Integer = 0 To row.Length - 1                arr.Add(row(i)("COLUMN_NAME"))            Next'--add tất cả tên các khoá trong Table ban đầu vào một ArrayList[code=vbnet]  '------------------------set khóa chính        If arr.Count = 1 Then            sEnd += " alter table " & "[" & NewTable & "]" & " add constraint " & "[" & "pk" & "_" & NewTable & "]" & " primary key clustered([" + arr(0) + "]) "        End If        If arr.Count = 2 Then            sEnd += " alter table " & "[" & NewTable & "]" & " add constraint " & "[" & "pk" & "_" & NewTable & "]" & " primary key clustered([" + arr(0) + "],[" + arr(1) + "]) "        End If        If arr.Count = 3 Then            sEnd += " alter table " & "[" & NewTable & "]" & " add constraint " & "[" & "pk" & "_" & NewTable & "]" & " primary key clustered([" + arr(0) + "],[" + arr(1) + "],[" + arr(2) + "]) "        End If        If arr.Count = 4 Then            sEnd += " alter table " & "[" & NewTable & "]" & " add constraint " & "[" & "pk" & "_" & NewTable & "]" & " primary key clustered([" + arr(0) + "],[" + arr(1) + "],[" + arr(2) + "],[" + arr(3) + "]) "        End If        If arr.Count = 5 Then            sEnd += " alter table " & "[" & NewTable & "]" & " add constraint " & "[" & "pk" & "_" & NewTable & "]" & " primary key clustered([" + arr(0) + "],[" + arr(1) + "],[" + arr(2) + "],[" + arr(3) + "],[" + arr(4) + "]) "        End If        If arr.Count = 6 Then            sEnd += " alter table " & "[" & NewTable & "]" & " add constraint " & "[" & "pk" & "_" & NewTable & "]" & " primary key clustered([" + arr(0) + "],[" + arr(1) + "],[" + arr(2) + "],[" + arr(3) + "],[" + arr(4) + "],[" + arr(5) + "]) "        End If        If arr.Count = 7 Then            sEnd += " alter table " & "[" & NewTable & "]" & " add constraint " & "[" & "pk" & "_" & NewTable & "]" & " primary key clustered([" + arr(0) + "],[" + arr(1) + "],[" + arr(2) + "],[" + arr(3) + "],[" + arr(4) + "],[" + arr(5) + "],[" + arr(6) + "]) "        End If        Try            If sEnd <> "" Then                If DoCmdRunSQL(sEnd) = True Then                End If            End If            '--set lại khoá chính cho bảng mới tạo với các tên các khoá chính đã Select từ Table gốc        Catch ex As Exception            MessageBox.Show("ERROR" & ControlChars.NewLine & ex.Message)        End Try

Mã: Chọn tất cả

   '-------------------set default value        Dim sdf As String = ""        Dim def As String = ""        sdf += " select table_name,column_name,column_default,data_type from INFORMATION_SCHEMA.COLUMNS "        sdf += " where TABLE_NAME='" + OldTable + "'"        sdf += " and COLUMN_DEFAULT is not null"        Dim mydt As New DataTable        SelectQuery(sdf, mydt)        Dim myrow() As DataRow        myrow = mydt.Select        'alter table [e_phieu nhap CT-007] add constraint default_value default 0 for TTVON        If myrow.Length > 0 Then            For j As Integer = 0 To myrow.Length - 1                def += " alter table " & "[" & NewTable & "]" & " add constraint default_value_" & NewTable & "_" & j + 1 & "" & " DEFAULT " _                & myrow(j)("column_default") & " for " & myrow(j)("column_name") & ControlChars.NewLine            Next        End If        Try            If def <> "" Then                DoCmdRunSQL(def)            End If'--set lại những giá trị Default cho bảng mới từ bảng ban đầu        Catch ex As Exception            MessageBox.Show("ERROR" & ControlChars.NewLine & ex.Message)        End Try
        End If[/code]
cách sử dụng

Mã: Chọn tất cả

Private Sub Copy_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click             copy(Me.TextBox1.Text.Trim, Me.TextBox2.Text.Trim)    End Sub
với

Mã: Chọn tất cả

Public Function SelectQuery(ByVal MySQLStr As String, ByRef rst_dt As DataTable) As Boolean        Dim MyResult As Boolean = False        Dim rst_da As SqlDataAdapter = Nothing        Try            rst_da = New SqlDataAdapter(MySQLStr, dbs)            rst_da.Fill(rst_dt)            If rst_dt.Rows.Count <> 0 Then                MyResult = True            End If        Catch ex As Exception            MessageBox.Show(ex.Message, "SELECTQUERY")        Finally            rst_da.Dispose()        End Try        Return MyResult    End Function

Mã: Chọn tất cả

Public Function DoCmdRunSQL(ByVal MySQLStr As String) As Boolean        Dim MyResult As Boolean = False        Dim MyCommand As New SqlCommand        Try            If dbs.State = ConnectionState.Closed Then                dbs.Open()            End If            MyCommand.Connection = dbs            MyCommand.CommandType = CommandType.Text            MyCommand.CommandText = MySQLStr            If MyCommand.ExecuteNonQuery <> -1 Then                MyResult = True            End If        Catch ex As Exception            MessageBox.Show(ex.Message, "DoCmdRunSQL")            'MessageBox.Show(ex.Message & ",Common/DoCmdRunSQL")        Finally            dbs.Close()            MyCommand.Dispose()        End Try        Return MyResult    End Function
P/S:khi tạo bảng mới các bạn không cần thêm dấu "[]" vào trứoc và sau tên bảng,chỉ cần gõ tên bình thường là Ok rồi,nếu thêm sẽ báo lỗi :))
hy vọng có ích cho người nào khi cần xài :D
Hỡi thế gian bug(lỗi) là gì?
Mà sửa...hoài không hết!
Đăng trả lời

Quay về