Kategoria Developing T-SQL

Własne definicje błędów w MS SQL Server

Często spotykamy się z sytuacjami gdzie tworząc swoje procedury składowane używamy funkcji RAISERROR() i obsługujemy podobne systuacje (zdarzenia) wyjątkowe. Używając sp_addmessage możemy dodać na stałe własny często występujący komunikat błędów.

Sp_addmessage dodaje do sys.messages nasz własny komunikat błędu, który jesteśmy wstanie wywołać przy pomocy Raiserror().

I tak np. utworzymy nowy komunikat ze zmienną %s w komunikacie błędu:

USE master
GO
EXEC sp_addmessage
100001,
14,
N'The current table %s is not updateable by your group!'
GO

Wywołanie komunikatu błędu za pomocą Raiserror przekazując parametr N’HumanResources.Employee’ :

RAISERROR (100001, 14, 1, N'HumanResources.Employee')

uzyskany komunikat to:

Msg 100001, Level 14, State 1, Line 3
The current table HumanResources.Employee is not updateable by your group

Opis składni:

  • msg_id – Id wywoływanego komunikatu błędu.Dozwolony zakres wartości od 50 001 and 2 147 483 647
  • severity – poziom ważności informacji w zakresie od 0 do 25.
    Poziomy od 0 do 18 mogą być określone przez dowolnego użytkownika.
    Poziomy ważności od 19 do 25 mogą być określone tylko przez...
Czytaj dalej

Dynamiczna budowa kodu a znak ‚

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
 
Czytaj dalej

Transpozycja Tabeli czyli taki tam mały pseudo Pivot

Przedstawiam kod do transpozycji tabeli. Kiedyś potrzebowałem coś podobnego pod MS SQL Server 2000. Chciałem użyć Pivota ale ….to nie ta wersja.

Proszę o uwagi i ewentualne propozycje zmian.

CREATE TABLE #t("Nazwa" varchar(20),
 "Wartosc" int);

INSERT INTO #t VALUES ('KOLUMNA1',2);
INSERT INTO #t VALUES ('KOLUMNA2',4);
INSERT INTO #t VALUES ('KOLUMNA3',6);
INSERT INTO #t VALUES ('KOLUMNA4',8);

SELECT * FROM #t;
GO
DECLARE @sql AS NVARCHAR(2000)
DECLARE @sql2 AS NVARCHAR(2000)
DECLARE @nazwa AS nvarchar(30)
DECLARE @wartosc AS int
DECLARE @licznik INT
DECLARE @zn char(1)

SET @sql='create table db ('
SET @sql2= 'insert into db values ('
SET @licznik=0
SET @zn=CHAR(39);

DECLARE c1 CURSOR FOR
SELECT    Nazwa, Wartosc FROM #t  

OPEN c1

FETCH c1 INTO @nazwa,@wartosc
WHILE (@@fetch_status = 0)
 BEGIN
 SET @licznik=@licznik+1
 if @licznik&gt;1
 BEGIN
 SET @sql=@sql+','   
 SET @sql2=@sql2+','  
 END     
 SET @sql= @sql +'"Nazwa'+ cast(@licznik AS nvarchar(3))+'" varchar(30), "Wartosc'+cast(@licznik AS nvarchar(3))+'" int'
 SET @sql2=@sql2+@zn+ @nazwa+@zn+','+CAST(@wartosc AS varchar(10))  
 FETCH c1 INTO  @nazwa,@wartosc
 END
 SET @sql...
Czytaj dalej

Jak podłączyć bazy typu dbf (dBase) do MS SQL Server ?

Z problemem tym zetknąłem się niedawno.  Jeszcze stare bazki dbf-owe nie upadły jeszcze. Na różnych forach są opisy, które nie do końca działają lub opisują tylko część problemu.

W pierwszej kolejności aby można było tworzyć zapytania ad-hockowe do tych baz należy zmienic konfigurację SQL Servera:

— rozszerzenie na opcje zaawansowane

exec sp_configure 'show advanced options',1
reconfigure with override;

— Włączenie możliwości zadawania zapytań typu Ad-Hoc

exec sp_configure 'Ad Hoc Distributed Queries',1
reconfigure with override;

–wyświetlenie zawartości bazy z pliku BazaDBF.dbf gdzie:

Pole_1, Pole_2, …, Pole_n – pola bazy danych

„MSDASQL” – provider OLE DB

DBQ=C:\Temp – ścieżka do folderu zawierającego pliki dbf

{Microsoft dBASE Driver (*.dbf)) – driver

BazaDBF – nazwa pliku dbf (nazwa całej bazy danych typu dbf, która jest zarazem jedną tabela o nazwie BazaDBF)

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