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

Melarikan diri dari kutipan tunggal di SQL Server

Sebuah kata nasihat. Saat menguji skrip dinamis, pertama-tama tampilkan saja alih-alih menjalankannya. Dengan begitu Anda akan dapat melihatnya persis seperti yang akan dilihat oleh EXEC pernyataan.

Sekarang ke masalah. Anda harus ingat bahwa Anda tidak melewatkan variabel ke SplitValues tetapi sebaliknya menggabungkan nilai variabel ke dalam skrip. Karena nilainya adalah varchar , itu harus digabungkan dengan tanda kutip di sekitarnya. Tidak adanya mereka adalah satu-satunya masalah.

Kutipan di sekitar argumen kedua, koma, diloloskan dengan benar dalam kedua kasus . Jadi, cukup gunakan salah satu metode untuk menambahkan tanda kutip di sekitar argumen pertama:

  • pengulangan tanda kutip:

    DECLARE @year varchar(max), @sql varchar(max);
    SET @year = '111,11';
    SET @sql = 'SELECT * FROM SplitValues(''' + @year + ''','','')';
    SELECT @sql;
    
  • menggunakan CHAR(39) :

    DECLARE @year varchar(max), @sql varchar(max);
    SET @year = '111,11';
    SET @sql = 'SELECT * FROM SplitValues(' + CHAR(39) + @year + CHAR(39) + ',' + CHAR(39) + ',' + CHAR(39) + ')';
    SELECT @sql;
    

Jelas, metode pertama lebih ringkas, tetapi, seperti yang saya katakan, keduanya bekerja dengan baik, seperti yang ditunjukkan dengan jelas oleh demo SQL Fiddle ini.

Namun, perhatikan bahwa Anda dapat dengan mudah menghindari masalah ini sejak awal, jika Anda memaafkan permainan kata-kata itu. Alih-alih EXEC () , Anda dapat menggunakan EXEC sp_executesql , yang memungkinkan Anda menggunakan parameter . Berikut skrip yang sama yang ditulis ulang untuk menggunakan sp_executesql :

DECLARE @year varchar(max), @delim char(1);
SET @year = '111,11';
SET @delim = ',';
EXEC sp_executesql
  N'SELECT * FROM SplitValues(@year_param,@delim_param)',
  N'@year_param varchar(max), @delim_param char(1)',
  @year,@delim;

Seperti yang Anda lihat, tidak perlu khawatir untuk keluar dari tanda kutip:SQL Server yang kesulitan mengganti nilai dengan benar, bukan Anda.



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Kesalahan CTE:Jenis tidak cocok antara jangkar dan bagian rekursif

  2. Cara melewatkan array ke prosedur tersimpan SQL Server

  3. Apakah tabrakan GUID mungkin terjadi?

  4. Kembalikan Prosedur &Fungsi Tersimpan dalam Database SQL Server:RUTIN (Contoh T-SQL)

  5. T-SQL untuk menemukan Nama Server Jarak Jauh dari server yang ditautkan