Sqlserver
 sql >> Teknologi Basis Data >  >> RDS >> Sqlserver

T-SQL Bagaimana cara membuat tabel secara dinamis dalam prosedur tersimpan?

Anda menggunakan variabel tabel yaitu Anda harus mendeklarasikan tabel. Ini bukan tabel sementara.

Anda membuat tabel sementara seperti ini:

CREATE TABLE #customer
(
     Name varchar(32) not null
)

Anda mendeklarasikan variabel tabel seperti ini:

DECLARE @Customer TABLE
(
      Name varchar(32) not null
)

Perhatikan bahwa tabel temp dideklarasikan menggunakan # dan variabel tabel dideklarasikan menggunakan @. Baca tentang perbedaan antara variabel tabel dan tabel temp.

PERBARUI:

Berdasarkan komentar Anda di bawah, Anda sebenarnya mencoba membuat tabel dalam prosedur tersimpan. Untuk ini, Anda perlu menggunakan SQL dinamis. Pada dasarnya SQL dinamis memungkinkan Anda untuk membuat Pernyataan SQL dalam bentuk string dan kemudian menjalankannya. Ini adalah SATU-SATUNYA cara Anda dapat membuat tabel dalam prosedur tersimpan. Saya akan menunjukkan kepada Anda bagaimana dan kemudian mendiskusikan mengapa ini bukan ide yang baik.

Sekarang untuk contoh sederhana (saya belum menguji kode ini tetapi seharusnya memberi Anda indikasi yang baik tentang bagaimana melakukannya):

CREATE PROCEDURE sproc_BuildTable 
    @TableName NVARCHAR(128)
   ,@Column1Name NVARCHAR(32)
   ,@Column1DataType NVARCHAR(32)
   ,@Column1Nullable NVARCHAR(32)
AS

   DECLARE @SQLString NVARCHAR(MAX)
   SET @SQString = 'CREATE TABLE '[email protected] + '( '[email protected]+' '[email protected] +' '[email protected] +') ON PRIMARY '

   EXEC (@SQLString)
   GO

Prosedur tersimpan ini dapat dijalankan seperti ini:

sproc_BuildTable 'Customers','CustomerName','VARCHAR(32)','NOT NULL'

Ada beberapa masalah besar dengan jenis prosedur tersimpan ini.

Akan sulit untuk melayani tabel yang rumit. Bayangkan struktur tabel berikut:

CREATE TABLE [dbo].[Customers] (
    [CustomerID] [int] IDENTITY(1,1) NOT NULL,
    [CustomerName] [nvarchar](64) NOT NULL,
    [CustomerSUrname] [nvarchar](64) NOT NULL,
    [CustomerDateOfBirth] [datetime] NOT NULL,
    [CustomerApprovedDiscount] [decimal](3, 2) NOT NULL,
    [CustomerActive] [bit] NOT NULL,
    CONSTRAINT [PK_Customers] PRIMARY KEY CLUSTERED 
    (
        [CustomerID] ASC
    ) WITH (PAD_INDEX  = OFF, STATISTICS_NORECOMPUTE  = OFF, IGNORE_DUP_KEY = OFF,      ALLOW_ROW_LOCKS  = ON, ALLOW_PAGE_LOCKS  = ON) ON [PRIMARY]
) ON [PRIMARY]
GO

ALTER TABLE [dbo].[Customers] ADD CONSTRAINT [DF_Customers_CustomerApprovedDiscount] DEFAULT ((0.00)) FOR [CustomerApprovedDiscount]
GO 

Tabel ini sedikit lebih kompleks daripada contoh pertama, tetapi tidak banyak. Prosedur tersimpan akan jauh lebih rumit untuk ditangani. Jadi, meskipun pendekatan ini mungkin berhasil untuk tabel kecil, pendekatan ini dengan cepat menjadi tidak dapat diatur.

Membuat tabel membutuhkan perencanaan. Saat Anda membuat tabel, tabel tersebut harus ditempatkan secara strategis pada grup file yang berbeda. Ini untuk memastikan bahwa Anda tidak menyebabkan perselisihan I/O disk. Bagaimana Anda akan mengatasi skalabilitas jika semuanya dibuat di grup file utama?

Bisakah Anda menjelaskan mengapa Anda perlu membuat tabel secara dinamis?

PEMBARUAN 2:

Pembaruan tertunda karena beban kerja. Saya membaca komentar Anda tentang perlunya membuat tabel untuk setiap toko dan saya pikir Anda harus melihatnya seperti contoh yang akan saya berikan kepada Anda.

Dalam contoh ini saya membuat asumsi berikut:

  1. Ini adalah situs e-niaga yang memiliki banyak toko
  2. Sebuah toko dapat memiliki banyak item (barang) untuk dijual.
  3. Barang tertentu (barang) dapat dijual di banyak toko
  4. Sebuah toko akan mengenakan harga yang berbeda untuk item (barang) yang berbeda
  5. Semua harga dalam $ (USD)

Katakanlah situs e-niaga ini menjual konsol game (yaitu Wii, PS3, XBOX360).

Melihat asumsi saya, saya melihat hubungan klasik banyak-ke-banyak. Sebuah toko dapat menjual banyak item (barang) dan item (barang) dapat dijual di banyak toko. Mari kita bagi menjadi beberapa tabel.

Pertama, saya membutuhkan meja toko untuk menyimpan semua informasi tentang toko.

Meja toko sederhana mungkin terlihat seperti ini:

CREATE TABLE [dbo].[Shop](
    [ShopID] [int] IDENTITY(1,1) NOT NULL,
    [ShopName] [nvarchar](128) NOT NULL,
    CONSTRAINT [PK_Shop] PRIMARY KEY CLUSTERED 
    (
      [ShopID] ASC
    ) WITH (
              PAD_INDEX  = OFF
              , STATISTICS_NORECOMPUTE  = OFF
              , IGNORE_DUP_KEY = OFF
              , ALLOW_ROW_LOCKS  = ON
              , ALLOW_PAGE_LOCKS  = ON
    ) ON [PRIMARY]
    ) ON [PRIMARY]

    GO

Mari kita masukkan tiga toko ke dalam database untuk digunakan selama contoh kita. Kode berikut akan menyisipkan tiga toko:

INSERT INTO Shop
SELECT 'American Games R US'
UNION
SELECT 'Europe Gaming Experience'
UNION
SELECT 'Asian Games Emporium'

Jika Anda menjalankan SELECT * FROM Shop Anda mungkin akan melihat yang berikut:

ShopID  ShopName
1           American Games R US
2           Asian Games Emporium
3           Europe Gaming Experience

Benar, jadi sekarang mari kita beralih ke tabel Items (barang). Karena barang/barang adalah produk dari berbagai perusahaan, saya akan menyebut produk meja. Anda dapat mengeksekusi kode berikut untuk membuat tabel Produk sederhana.

CREATE TABLE [dbo].[Product](
    [ProductID] [int] IDENTITY(1,1) NOT NULL,
    [ProductDescription] [nvarchar](128) NOT NULL,
 CONSTRAINT [PK_Product] PRIMARY KEY CLUSTERED 
 (
     [ProductID] ASC
 )WITH (PAD_INDEX  = OFF
        , STATISTICS_NORECOMPUTE  = OFF
        , IGNORE_DUP_KEY = OFF
        ,     ALLOW_ROW_LOCKS  = ON
         , ALLOW_PAGE_LOCKS  = ON) ON [PRIMARY]
  ) ON [PRIMARY]

GO

Mari kita isi tabel produk dengan beberapa produk. Jalankan kode berikut untuk memasukkan beberapa produk:

INSERT INTO Product
SELECT 'Wii'
UNION 
SELECT 'PS3'
UNION 
SELECT 'XBOX360'

Jika Anda menjalankan SELECT * FROM Product Anda mungkin akan melihat yang berikut:

ProductID   ProductDescription
1           PS3
2           Wii
3           XBOX360

Oke, pada titik ini Anda memiliki informasi produk dan toko. Jadi bagaimana Anda menyatukan mereka? Kami tahu kami dapat mengidentifikasi toko dengan kolom kunci utama ShopID dan kami tahu kami dapat mengidentifikasi produk dengan kolom kunci utama ProductID-nya. Selain itu, karena setiap toko memiliki harga yang berbeda untuk setiap produk, kami perlu menyimpan harga yang dibebankan toko untuk produk tersebut.

Jadi kami memiliki tabel yang memetakan Toko ke produk. Kami akan menyebut tabel ini ShopProduct. Versi sederhana dari tabel ini mungkin terlihat seperti ini:

CREATE TABLE [dbo].[ShopProduct](
[ShopID] [int] NOT NULL,
[ProductID] [int] NOT NULL,
[Price] [money] NOT NULL,
CONSTRAINT [PK_ShopProduct] PRIMARY KEY CLUSTERED 
 (
     [ShopID] ASC,
      [ProductID] ASC
 )WITH (PAD_INDEX  = OFF,
     STATISTICS_NORECOMPUTE  = OFF, 
     IGNORE_DUP_KEY = OFF, 
     ALLOW_ROW_LOCKS  = ON,
     ALLOW_PAGE_LOCKS  = ON) ON [PRIMARY]
  ) ON [PRIMARY]

 GO

Jadi anggap saja toko American Games R Us hanya menjual konsol Amerika, Europe Gaming Experience menjual semua konsol dan Asian Games Emporium hanya menjual konsol Asia. Kita perlu memetakan kunci utama dari tabel toko dan produk ke tabel ShopProduct.

Berikut adalah bagaimana kita akan melakukan pemetaan. Dalam contoh saya, American Games R Us memiliki nilai ShopID 1 (ini adalah nilai kunci utama) dan saya dapat melihat bahwa XBOX360 memiliki nilai 3 dan toko telah mencantumkan XBOX360 seharga $159,99

Dengan mengeksekusi kode berikut, Anda akan menyelesaikan pemetaan:

INSERT INTO ShopProduct VALUES(1,3,159.99)

Sekarang kami ingin menambahkan semua produk ke toko Europe Gaming Experience. Dalam contoh ini kita mengetahui bahwa toko Europe Gaming Experience memiliki ShopID 3 dan karena toko tersebut menjual semua konsol, kita perlu memasukkan ProductID 1, 2 dan 3 ke dalam tabel pemetaan. Mari kita asumsikan harga konsol (produk) di toko Europe Gaming Experience adalah sebagai berikut:1- PS3 dijual seharga $259,99 , 2- Wii dijual seharga $159,99 , 3- XBOX360 dijual seharga $199,99.

Untuk menyelesaikan pemetaan ini, Anda perlu menjalankan kode berikut:

INSERT INTO ShopProduct VALUES(3,2,159.99) --This will insert the WII console into the mapping table for the Europe Gaming Experience Shop with a price of 159.99
INSERT INTO ShopProduct VALUES(3,1,259.99) --This will insert the PS3 console into the mapping table for the Europe Gaming Experience Shop with a price of 259.99
INSERT INTO ShopProduct VALUES(3,3,199.99) --This will insert the XBOX360 console into the mapping table for the Europe Gaming Experience Shop with a price of 199.99

Pada titik ini Anda telah memetakan dua toko dan produknya ke dalam tabel pemetaan. Oke, jadi sekarang bagaimana cara menyatukan ini semua untuk menunjukkan pengguna menjelajahi situs web? Katakanlah Anda ingin menampilkan semua produk untuk Pengalaman Gaming Eropa kepada pengguna di halaman web – Anda perlu menjalankan kueri berikut:

SELECT      Shop.*
        , ShopProduct.*
        , Product.*
FROM         Shop 
INNER JOIN  ShopProduct ON Shop.ShopID = ShopProduct.ShopID 
INNER JOIN  Product ON ShopProduct.ProductID = Product.ProductID
WHERE       Shop.ShopID=3

Anda mungkin akan melihat hasil berikut:

ShopID     ShopName                 ShopID  ProductID   Price   ProductID   ProductDescription
3          Europe Gaming Experience   3         1       259.99  1           PS3
3          Europe Gaming Experience   3         2       159.99  2           Wii
3          Europe Gaming Experience   3         3       199.99  3           XBOX360

Sekarang untuk satu contoh terakhir, mari kita asumsikan bahwa situs web Anda memiliki fitur yang menemukan harga termurah untuk sebuah konsol. Seorang pengguna meminta untuk menemukan harga termurah untuk XBOX360.

Anda dapat menjalankan kueri berikut:

 SELECT     Shop.*
        , ShopProduct.*
        , Product.*
 FROM         Shop 
 INNER JOIN  ShopProduct ON Shop.ShopID = ShopProduct.ShopID 
 INNER JOIN  Product ON ShopProduct.ProductID = Product.ProductID
 WHERE      Product.ProductID =3  -- You can also use Product.ProductDescription = 'XBOX360'
 ORDER BY    Price ASC

Kueri ini akan menampilkan daftar semua toko yang menjual XBOX360 dengan toko termurah terlebih dahulu dan seterusnya.

Anda akan melihat bahwa saya belum menambahkan toko Asian Games. Sebagai latihan, tambahkan toko game Asia ke tabel pemetaan dengan produk berikut:Asian Games Emporium menjual konsol game Wii seharga $99,99 dan konsol PS3 seharga $159,99. Jika Anda mengerjakan contoh ini, Anda sekarang harus memahami bagaimana memodelkan hubungan banyak-ke-banyak.

Saya harap ini membantu Anda dalam perjalanan Anda dengan desain database.



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. SQL Server Resumable Index:Apakah ini baik untuk Anda?

  2. Buat Database SQL Server dengan Azure Data Studio

  3. bisakah kita memiliki kunci asing yang bukan kunci utama di tabel lain?

  4. Cara membuat daftar semua tanggal di antara dua tanggal

  5. Fungsi di SQL Server 2008 mirip dengan GREATEST di mysql?