Kompilasi bersyarat dari prosedur tersimpan SQL Server

8

Versi singkat: Apakah ada beberapa cara untuk mengkompilasi potongan kode TSQL secara kondisional dalam Proyek Data SQL Server menggunakan Alat Data Server SQL untuk Visual Studio 2010?

Saya menggunakan Alat Data SQL Server di Visual Studio 2010 untuk bekerja pada database SQL Server Express eksperimental. Tujuan akhirnya jika semuanya berfungsi dengan baik adalah platform perusahaan SQL Server. Saya memiliki contoh 2008 di satu kotak dan contoh 2012 di kotak lain, karena perusahaan saya sedang dalam proses migrasi 2008-2012 untuk banyak database perusahaan juga.

Dalam bahasa pemrograman lain yang saya gunakan, arahan preprocessor memudahkan mengkompilasi bagian-bagian basis kode. Penggunaan yang paling umum untuk ini adalah memiliki kode yang berbeda untuk platform yang berbeda di bagian terbatas atau untuk mengecualikan kode keluaran debug dari build rilis .

Kedua hal ini bisa sangat membantu dalam beberapa prosedur toko yang sedang saya kerjakan. Apakah ada yang seperti ini tersedia? Saya tahu saya bisa menggunakan sqlcmdvariabel untuk menukar nilai tertentu selama penerapan, tetapi saya tidak tahu cara menggunakannya untuk memasukkan atau mengecualikan potongan kode selanjutnya.

Contoh:

#IF $(DebugVersion) = 'True'
    -- A bunch of useful PRINTs and what not
#ELSE
    SET NOCOUNT ON
#ENDIF

#IF $(SSVersion) = '2012'
    SET @pretty_date = FORMAT(@some_date, 'dddd, MMM dd, yyyy')
#ELSE
    SET @pretty_date = CAST(@some_date AS nvarchar(12))
#ENDIF
Joshua Honig
sumber

Jawaban:

6

Sayangnya saya tidak menyadari hal ini dimungkinkan dengan SSDT.

Bergantung pada seberapa besar proyek tersebut dan berapa banyak prosedur yang ingin Anda tingkatkan dengan barang 2012, mungkin dapat dikelola dengan Proyek Komposit .

SSDT dapat menggabungkan proyek basis data dengan satu atau lebih proyek basis data atau dacpac yang dirujuk untuk menggambarkan skema basis data komposit tunggal. Menggunakan proyek komposit memungkinkan database besar untuk dipecah menjadi potongan-potongan yang lebih mudah dikelola, memungkinkan orang atau tim yang berbeda memiliki tanggung jawab untuk bagian yang berbeda dari skema keseluruhan, dan memungkinkan penggunaan kembali definisi objek database dalam banyak basis data.

Gagasannya adalah memiliki proyek dasar, yang berisi definisi objek umum dan proyek khusus versi untuk prosedur yang menggunakan fitur baru. Proyek 2012 akan merujuk proyek dasar dan kompilasi / pembangunan akan menggabungkan objek dari keduanya.

PITA adalah bahwa Anda tidak dapat menimpa objek dalam proyek dasar dengan objek dalam komposit, jadi Anda harus mempertahankan proyek-proyek dasar, 2008 & 2012. Ketika Anda menginginkan versi 2012 dari prosedur tertentu, Anda harus menghapusnya dari pangkalan dan membuat versi di proyek 2008 & 2012.

Mark Storey-Smith
sumber
2

Saya telah melakukan diskusi terbuka tentang MSDN tentang kebutuhan ini. Belum membuat banyak kemajuan. Situasi ideal akan memungkinkan Anda untuk menandai objek db sebagai "warisan" dalam proyek ssdt dasar sehingga proyek lain yang merujuk proyek dasar atau DAC tidak akan mengeluh tentang objek duplikat, dan hanya akan membuat objek dasar atau "rintisan" jika itu tidak ada. Ini akan memungkinkan Anda untuk memiliki "lapisan" model database. Lihat posting saya di msdn. Memperluas Solusi Komposit SSDT dengan Prosedur Tersimpan Overriden

pengguna2624727
sumber
2

Saya mencapai sesuatu yang dekat dengan apa yang diminta dengan menggunakan acara prebuild. Dalam kasus saya, saya ingin pengguna dan login yang berbeda dimasukkan dalam penyebaran sesuai dengan konfigurasi yang sedang dibangun.

Untuk melakukan ini, saya membuat file .sql untuk setiap konfigurasi build, untuk setiap pengguna. Saya menandai ini sebagai Build Action 'None': (Saya meletakkan ini di subfolder proyek)

  • Debug_SomeUser.sql
  • Release_SomeUser.sql

Saya kemudian membuat file SomeUser.sql kosong (dengan Build Action = 'Build').

Di baris perintah acara Pra-bangun:

Copy $(ProjectDir)subfolder\$(Configuration)_Someuser.sql $(ProjectDir)Someuser.sql

Itu adalah gangguan bahwa tim coders terus-menerus menciptakan konflik di git, jadi saya juga menambahkan ke baris perintah pra-bangun

git update-index --assume-unchanged $(ProjectDir)Someuser.sql 

Itu cukup fiddly untuk mendapatkan ini berfungsi karena saya memiliki jumlah pengguna dan konfigurasi yang jauh lebih besar untuk dipertimbangkan, tetapi berfungsi.

Hugh Jones
sumber