Budując kod T-SQL dynamicznie wielokrotnie można spotkać się z problemem znaku ’.

Np. mając do dyspozycji fragment kodu z „Jak podłączyć bazy typu dbf (dBase) do MS SQL Server ?”

SELECT Pole_1, Pole_2, ..., Pole_n
FROM OPENROWSET('MSDASQL','Driver={Microsoft dBASE Driver (*.dbf)};DBQ=C:\Temp','SELECT * FROM BazaDBF')

chcąc np. dynamicznie zmieniać ścieżkę C:\Temp należało by w zmiennej tekstowej użyć znaku ’, ale przecież znak ten rozpoczyna i kończy ciąg tekstowy.

Należy zastosować funkcję char(), która zwraca znak o odpowiednim numerze. I Tak nasz znak ’ to char(39).

declare @cmd varchar(500);
declare @pp varchar(20);
set @pp='C:\Temp' 

set @cmd = 'INSERT INTO Baza (POLE_1, POLE_2, POLE_3) 
            SELECT POLE_1, POLE_2, POLE_3
            FROM OPENROWSET('+<strong>CHAR(39)</strong>+'MSDASQL'+<strong>CHAR(39)</strong>+','+
            <strong>CHAR(39)</strong>+'Driver={Microsoft dBASE Driver (*.dbf)};DBQ='+@pp+<strong>CHAR(39)</strong>+','+ 
            <strong>CHAR(39)</strong>+'SELECT * FROM BazaDBF'+<strong>CHAR(39)</strong>+')'                 

exec sys.sp_sqlexec @cmd
 

Dariusz Brejnak

Od prawie trzydziestu lat jest pasjonatem informatyki, a zwłaszcza dziedzin dotyczących baz danych, hurtowni danych oraz ogólnie rozumianej tematyki BI. Jego druga pasja to fotografia http://dariuszbrejnak.pl

3 komentarze

roku · 11 września 2010 o 13:24

nieczytelne, uzycie 2x apostrof „maskuje” go i nie jest interpretowane jako koniec stringu

FROM OPENROWSET(’MSDASQL”,”Driver={Microsoft dBASE Driver (*.dbf)};DBQ=’+@pp+”’,”SELECT * FROM BazaDBF”)’

roku · 11 września 2010 o 13:28

mozna tez zmienic

SET QUOTED_IDENTIFIER ON;

Dariusz Brejnak · 11 września 2010 o 13:33

Tak, użycie 2 apostrofów jest szybsze i prostsze, ale czasem w bardzo długim kodzie, gdzie był budowany skrypt i ilość apostrofów gwałtownie wzrosła wymyśliłem ten sposób. Dzięki temu mogłem szybko odróżnić apostrofy kodu od apostrofów budowanego skryptu. Jak widać wszystko można budować na wiele sposobów. Kwestia przyzwyczajenia. To tak samo jak z char(10), char(13)

Pozdrawiam

Możliwość komentowania została wyłączona.