• Vui lòng đọc nội qui diễn đàn để tránh bị xóa bài viết
  • Tìm kiếm trước khi đặt câu hỏi

Dùng Select * Into trong SQL

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

Điều hành viên: tungcan5diop, QUANITGROBEST

Hình đại diện của người dùng
tungcan5diop
Cựu chiến binh
Cựu chiến binh
Bài viết: 1123
Ngày tham gia: T.Tư 24/09/2008 4:04 pm
Đến từ: TPHCM
Has thanked: 1 time
Been thanked: 28 time

Dùng Select * Into trong SQL

Gửi bàigửi bởi tungcan5diop » T.Hai 10/08/2009 7:42 pm

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 hết

  1. 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 hết

  1. 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 hết

  1.    Sub copy(ByVal OldTable As String, ByVal NewTable As String)
  2.         Dim sql As String = ""
  3.         Dim sFirst As String = ""
  4.         Dim sEnd As String = ""
  5.         sql += "IF OBJECT_ID('" + NewTable + "') IS NOT NULL"
  6.         sql += " DROP TABLE " + "[" & NewTable & "]" + ";"
  7.         sql += "select * into " & "[" & NewTable & "]" & " from " & "[" & OldTable & "]" & " where 1=2;"
  8.         DoCmdRunSQL(sql)
  9.         Dim dt As New DataTable
  10.         sFirst += " select INFORMATION_SCHEMA.COLUMNS.[COLUMN_NAME],INFORMATION_SCHEMA.COLUMNS.[IS_NULLABLE]," & ControlChars.NewLine
  11.         sFirst += " INFORMATION_SCHEMA.COLUMNS.[DATA_TYPE], INFORMATION_SCHEMA.COLUMNS.[CHARACTER_MAXIMUM_LENGTH]" & ControlChars.NewLine
  12.         sFirst += " from INFORMATION_SCHEMA.COLUMNS" & ControlChars.NewLine
  13.         sFirst += " where table_name='" + OldTable + "' and INFORMATION_SCHEMA.COLUMNS.[COLUMN_NAME] in" & ControlChars.NewLine
  14.         sFirst += " (" & ControlChars.NewLine
  15.         sFirst += " select a.COLUMN_NAME from INFORMATION_SCHEMA.KEY_COLUMN_USAGE a" & ControlChars.NewLine
  16.         sFirst += " inner join INFORMATION_SCHEMA.TABLE_CONSTRAINTS b" & ControlChars.NewLine
  17.         sFirst += " on a.CONSTRAINT_NAME = b.CONSTRAINT_NAME" & ControlChars.NewLine
  18.         sFirst += " where a.table_name = '" + OldTable + "'" & ControlChars.NewLine
  19.         sFirst += " and constraint_type = 'Primary key'" & ControlChars.NewLine
  20.         sFirst += " ) " & ControlChars.NewLine
  21.  
  22.         Dim row() As DataRow
  23.         SelectQuery(sFirst, dt)
  24.         row = dt.Select
  25.         Dim arr As New ArrayList
  26.         If row.Length > 0 Then
  27.             For i As Integer = 0 To row.Length - 1
  28.                 arr.Add(row(i)("COLUMN_NAME"))
  29.             Next
  30.         End If
  31.  
  32.         '--xóa constraint trứơc khi add
  33.         '        IF EXISTS (SELECT * FROM sysobjects WHERE name = 'pk_E_phieu nhap-007')
  34.         '            BEGIN
  35.         'ALTER TABLE [E_phieu nhap-007]
  36.         'DROP CONSTRAINT [pk_E_phieu nhap-007]
  37.         'alter table [E_phieu nhap-007] add constraint [pk_E_phieu nhap-007]
  38.         'primary key clustered([SOCT],[NEWID])
  39.         '            End
  40.  
  41.      
  42.         '------------------------set khóa chính
  43.         If arr.Count = 1 Then
  44.             sEnd += " alter table " & "[" & NewTable & "]" & " add constraint " & "[" & "pk" & "_" & NewTable & "]" & " primary key clustered([" + arr(0) + "]) "
  45.         End If
  46.         If arr.Count = 2 Then
  47.             sEnd += " alter table " & "[" & NewTable & "]" & " add constraint " & "[" & "pk" & "_" & NewTable & "]" & " primary key clustered([" + arr(0) + "],[" + arr(1) + "]) "
  48.         End If
  49.         If arr.Count = 3 Then
  50.             sEnd += " alter table " & "[" & NewTable & "]" & " add constraint " & "[" & "pk" & "_" & NewTable & "]" & " primary key clustered([" + arr(0) + "],[" + arr(1) + "],[" + arr(2) + "]) "
  51.         End If
  52.         If arr.Count = 4 Then
  53.             sEnd += " alter table " & "[" & NewTable & "]" & " add constraint " & "[" & "pk" & "_" & NewTable & "]" & " primary key clustered([" + arr(0) + "],[" + arr(1) + "],[" + arr(2) + "],[" + arr(3) + "]) "
  54.         End If
  55.         If arr.Count = 5 Then
  56.             sEnd += " alter table " & "[" & NewTable & "]" & " add constraint " & "[" & "pk" & "_" & NewTable & "]" & " primary key clustered([" + arr(0) + "],[" + arr(1) + "],[" + arr(2) + "],[" + arr(3) + "],[" + arr(4) + "]) "
  57.         End If
  58.         If arr.Count = 6 Then
  59.             sEnd += " alter table " & "[" & NewTable & "]" & " add constraint " & "[" & "pk" & "_" & NewTable & "]" & " primary key clustered([" + arr(0) + "],[" + arr(1) + "],[" + arr(2) + "],[" + arr(3) + "],[" + arr(4) + "],[" + arr(5) + "]) "
  60.         End If
  61.         If arr.Count = 7 Then
  62.             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) + "]) "
  63.         End If
  64.         Try
  65.             If sEnd <> "" Then
  66.                 If DoCmdRunSQL(sEnd) = True Then
  67.                 End If
  68.             End If
  69.            
  70.         Catch ex As Exception
  71.             MessageBox.Show("ERROR" & ControlChars.NewLine & ex.Message)
  72.         End Try
  73.  
  74.  
  75.  
  76.         '-------------------set default value
  77.         Dim sdf As String = ""
  78.         Dim def As String = ""
  79.         sdf += " select table_name,column_name,column_default,data_type from INFORMATION_SCHEMA.COLUMNS "
  80.         sdf += " where TABLE_NAME='" + OldTable + "'"
  81.         sdf += " and COLUMN_DEFAULT is not null"
  82.         Dim mydt As New DataTable
  83.         SelectQuery(sdf, mydt)
  84.         Dim myrow() As DataRow
  85.         myrow = mydt.Select
  86.         'alter table [e_phieu nhap CT-007] add constraint default_value default 0 for TTVON
  87.         If myrow.Length > 0 Then
  88.             For j As Integer = 0 To myrow.Length - 1
  89.                 def += " alter table " & "[" & NewTable & "]" & " add constraint default_value_" & NewTable & "_" & j + 1 & "" & " DEFAULT " _
  90.                 & myrow(j)("column_default") & " for " & myrow(j)("column_name") & ControlChars.NewLine
  91.             Next
  92.         End If
  93.         Try
  94.             If def <> "" Then
  95.                 DoCmdRunSQL(def)
  96.             End If
  97.  
  98.         Catch ex As Exception
  99.             MessageBox.Show("ERROR" & ControlChars.NewLine & ex.Message)
  100.         End Try
  101.         MessageBox.Show("Chuyển thành công")
  102.     End Sub
  103.  

hàm trên khá dài nhưng ko sao mình sẽ comment :)

Mã: Chọn hết

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

Mã: Chọn hết

  1.   Dim arr As New ArrayList
  2.         If row.Length > 0 Then
  3.             For i As Integer = 0 To row.Length - 1
  4.                 arr.Add(row(i)("COLUMN_NAME"))
  5.             Next
  6. '--add tất cả tên các khoá trong Table ban đầu vào một ArrayList
  7. [code=vbnet]  '------------------------set khóa chính
  8.         If arr.Count = 1 Then
  9.             sEnd += " alter table " & "[" & NewTable & "]" & " add constraint " & "[" & "pk" & "_" & NewTable & "]" & " primary key clustered([" + arr(0) + "]) "
  10.         End If
  11.         If arr.Count = 2 Then
  12.             sEnd += " alter table " & "[" & NewTable & "]" & " add constraint " & "[" & "pk" & "_" & NewTable & "]" & " primary key clustered([" + arr(0) + "],[" + arr(1) + "]) "
  13.         End If
  14.         If arr.Count = 3 Then
  15.             sEnd += " alter table " & "[" & NewTable & "]" & " add constraint " & "[" & "pk" & "_" & NewTable & "]" & " primary key clustered([" + arr(0) + "],[" + arr(1) + "],[" + arr(2) + "]) "
  16.         End If
  17.         If arr.Count = 4 Then
  18.             sEnd += " alter table " & "[" & NewTable & "]" & " add constraint " & "[" & "pk" & "_" & NewTable & "]" & " primary key clustered([" + arr(0) + "],[" + arr(1) + "],[" + arr(2) + "],[" + arr(3) + "]) "
  19.         End If
  20.         If arr.Count = 5 Then
  21.             sEnd += " alter table " & "[" & NewTable & "]" & " add constraint " & "[" & "pk" & "_" & NewTable & "]" & " primary key clustered([" + arr(0) + "],[" + arr(1) + "],[" + arr(2) + "],[" + arr(3) + "],[" + arr(4) + "]) "
  22.         End If
  23.         If arr.Count = 6 Then
  24.             sEnd += " alter table " & "[" & NewTable & "]" & " add constraint " & "[" & "pk" & "_" & NewTable & "]" & " primary key clustered([" + arr(0) + "],[" + arr(1) + "],[" + arr(2) + "],[" + arr(3) + "],[" + arr(4) + "],[" + arr(5) + "]) "
  25.         End If
  26.         If arr.Count = 7 Then
  27.             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) + "]) "
  28.         End If
  29.         Try
  30.             If sEnd <> "" Then
  31.                 If DoCmdRunSQL(sEnd) = True Then
  32.                 End If
  33.             End If
  34.             '--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
  35.         Catch ex As Exception
  36.             MessageBox.Show("ERROR" & ControlChars.NewLine & ex.Message)
  37.         End Try[/code]
  38. [code=vbnet]   '-------------------set default value
  39.         Dim sdf As String = ""
  40.         Dim def As String = ""
  41.         sdf += " select table_name,column_name,column_default,data_type from INFORMATION_SCHEMA.COLUMNS "
  42.         sdf += " where TABLE_NAME='" + OldTable + "'"
  43.         sdf += " and COLUMN_DEFAULT is not null"
  44.         Dim mydt As New DataTable
  45.         SelectQuery(sdf, mydt)
  46.         Dim myrow() As DataRow
  47.         myrow = mydt.Select
  48.         'alter table [e_phieu nhap CT-007] add constraint default_value default 0 for TTVON
  49.         If myrow.Length > 0 Then
  50.             For j As Integer = 0 To myrow.Length - 1
  51.                 def += " alter table " & "[" & NewTable & "]" & " add constraint default_value_" & NewTable & "_" & j + 1 & "" & " DEFAULT " _
  52.                 & myrow(j)("column_default") & " for " & myrow(j)("column_name") & ControlChars.NewLine
  53.             Next
  54.         End If
  55.         Try
  56.             If def <> "" Then
  57.                 DoCmdRunSQL(def)
  58.             End If
  59. '--set lại những giá trị Default cho bảng mới từ bảng ban đầu
  60.         Catch ex As Exception
  61.             MessageBox.Show("ERROR" & ControlChars.NewLine & ex.Message)
  62.         End Try[/code]
  63.         End If

cách sử dụng

Mã: Chọn hết

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

với

Mã: Chọn hết

  1. Public Function SelectQuery(ByVal MySQLStr As String, ByRef rst_dt As DataTable) As Boolean
  2.         Dim MyResult As Boolean = False
  3.         Dim rst_da As SqlDataAdapter = Nothing
  4.         Try
  5.             rst_da = New SqlDataAdapter(MySQLStr, dbs)
  6.             rst_da.Fill(rst_dt)
  7.             If rst_dt.Rows.Count <> 0 Then
  8.                 MyResult = True
  9.             End If
  10.         Catch ex As Exception
  11.             MessageBox.Show(ex.Message, "SELECTQUERY")
  12.         Finally
  13.             rst_da.Dispose()
  14.         End Try
  15.         Return MyResult
  16.     End Function

Mã: Chọn hết

  1. Public Function DoCmdRunSQL(ByVal MySQLStr As String) As Boolean
  2.         Dim MyResult As Boolean = False
  3.         Dim MyCommand As New SqlCommand
  4.         Try
  5.             If dbs.State = ConnectionState.Closed Then
  6.                 dbs.Open()
  7.             End If
  8.             MyCommand.Connection = dbs
  9.             MyCommand.CommandType = CommandType.Text
  10.             MyCommand.CommandText = MySQLStr
  11.             If MyCommand.ExecuteNonQuery <> -1 Then
  12.                 MyResult = True
  13.             End If
  14.         Catch ex As Exception
  15.             MessageBox.Show(ex.Message, "DoCmdRunSQL")
  16.             'MessageBox.Show(ex.Message & ",Common/DoCmdRunSQL")
  17.         Finally
  18.             dbs.Close()
  19.             MyCommand.Dispose()
  20.         End Try
  21.         Return MyResult
  22.     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!

Quay về “[.NET] Mẹo vặt khác”

Đang trực tuyến

Đang xem chuyên mục này: Không có thành viên nào trực tuyến.2 khách