HyperLink
Bejelentkezés
E-mail: 
Jelszó: 





Skip Navigation Links
 

Hasznos Script-ek MS SQL Server-ben


Példaprogram letöltése

116438 bájt

A Microsoft SQL Server 2000 hasznos tulajdonságokkal bővült a korábbi verziókhoz képest. Ezek közé tartozik néhány olyan funkció, melyek egy csokorban most bemutatásra kerülnek cikkünkben. Bemutatjuk, hogyan tudunk tárolt eljárásból üzenetet küldeni a helyi hálózat tetszőleges számítógépére, illetve milyen módszerekkel dolgozhatók fel az XML állományokban tárolt információk eljárásainkban. A harmadik témánkban bemutatjuk, hogyan lehet egy tetszőleges erőforrást linkelt szerverként az MS SQL Serverhez kapcsolni, és információit programból elérni.

A példához szükséges a SampleDB adatbázis, melyet a mellékelt Run.cmd BATCH állomány lefuttatásával hozhatunk létre. Csak arra kell ügyelni, hogy a SampleDB.sql parancsállomány a BATCH állománnyal azonos mappában legyen. A SampleDB.sql parancsállomány 5. sorában adja meg helyesen a létrehozandó adatbázisfájlok mappájának nevét és elérési útvonalát.
Üzenetküldés tárolt eljárásból
Az xp_cmdshell beépített tárolt eljárás sokak számára lehet ismerős, használatának lehetőségei széles palettán mozognak. A tárolt eljárással tetszőleges parancs végrehajtható, mintha csak a parancssorba írnánk azokat. Használata igen egyszerű, csak meg kell adni egy karakterlánc formájában a kívánt parancsot a tárolt eljárás paramétereként és lefuttatni azt. Szintaxisa a következő:
xp_cmdshell <parancs>
A bemenő paramétere varchar(255) vagy nvarchar(4000) lehet, alapértelmezett értéke nincs.
A mellékelt alkalmazásban a SendMessage tárolt eljárásban valósítottuk meg az üzenetküldést a fenti ismeretek birtokában. Az eljárás kódja a következő:
create procedure SendMessage (@target varchar(100), @message varchar(500))
as
  declare @m varchar(500)
  set @m = 'net send ' + @target + ' "' + @message + '"'
  exec master.dbo.xp_cmdshell @m
GO
Az eljárás két paramétert vár: az első a cél számítógép IP címét vagy nevét tartalmazza, míg a másik paraméter az üzenet szövegét. Látható, hogy az üzenet a NET SEND parancsokkal történik, melyet a parancssorokban is használunk a Windows rendszerben.
A parancs után kell megadni a célcímet, és azt követően – idézőjelek közt – az üzenet szövegét.
A TARGET nevű számítógépre így a következő módon küldhető üzenet:
net send TARGET ”Minta üzenet...”
Az üzenet egy kis üzenetablakban jelenik meg.
OPENXML metódus
Az OPENXML metódus segítségével egy szöveges formában megadott XML állományból nyerhetők ki adatok, melyeket a metódus egy úgynevezett ROWSET formában visszaad. A kinyert adatok azt követően tetszőleges további SQL utasítások INPUT-jai lehetnek.
A metódus szintaxisa – a leggyakrabban használt argumentumokkal – a következő:
OPENXML
  (idoc int [in],
   rowpattern nvarchar[in],
   [flags byte[in]])
   [WITH (sémadeklaráció | táblanév)]
Az argumentumok listája az alábbi – számunkra most fontos - elemeket tartalmazhatja:
  • idoc: konstans, mely az input dokumentum kezelőjét tartalmazza, és amelyet a sp_xml_preparedocument metódussal generálhatunk az XML formátumú információ megadása után.
  • rowpattern: az XML szerkezetéttől függő karakterlánc, mely az információt tartalmazó csomópont elérhetőségét hordozza.
A SampleDb.sql parancsállomány lefuttatása után létrejött tárolt eljárás neve GetDataFromXML, melynek első paramétere az XML állományt karakterláncként tartalmazó sztring.
Az Root.xml állományt az alkalmazásban beolvassuk egy karakterláncba, melyet a tárolt eljárás megkap. Az XML szerkezete a következő:
<?xml version="1.0" ?>
<ROOT>
<Customer CustomerID="1001" ContactName="Paul Henriot">
   <Order OrderID="10101" CustomerID="1001" EmployeeID="5" OrderDate="1996-07-04">
      <OrderDetail ProductID="11" Quantity="12"/>
      <OrderDetail ProductID="42" Quantity="10"/>
   </Order>
</Customer>
...
</ROOT>
Az információ az XML állomány tagjainak attribútumaiban található, innen kell kiolvasnunk a metódussal. Látható, hogy az XML három szint mélységű, vagyis Customers, Orders és OrderDetails elemeket találunk a Root tagban.
A mellékelt példában az OPENXML fül alatt elegendő kiválasztanunk egy OrderID értéket, mely a középső szinten van, és a metódus visszaadja a megrendeléshez kapcsolódó megrendelő kapcsolattartójának nevét.
Lássuk, hogyan is történik ez a tárolt eljárásban.
Create procedure GetDataFromXML(@xmldoc varchar(1000),@oid int,@cname varchar(30) output)
AS
  DECLARE @idoc int
  DECLARE @name varchar(30)
Az említett módon generáljuk a kapott dokumentum azonosítóját:
  EXEC sp_xml_preparedocument @idoc OUTPUT, @xmldoc
Majd egy SELECT utasítás részeként meghívva a metódust lekérdezzük a ROWSET-ből a kért információt. Ehhez a WITH kulcsszóra van szükségünk, melyben megadjuk a műveletben szereplő változókat.
  SELECT @name = ContactName
  FROM   OPENXML (@idoc, '/ROOT/Customer/Order/OrderDetail',2)
  WITH (ContactName varchar(30) '../../@ContactName',
        OrderID       int         '../@OrderID')
  WHERE OrderID = @oid
  Set @cname = @name
GO
A hívó alkalmazásban az XML állomány információit egy StringBuilder objektumba olvassuk be, és azt követően adjuk át a tárolt eljárás első paraméterének.
Az alkalmazásban a MŰVELET gombra kattintva indíthatjuk a műveletet.
OPENROWSET metódus
A metódus segítségével megismerhetjük annak módját, hogy miként lehet linkelt szerverként az adatbázis-szerverben elérhető adatforrásokon SQL utasításokat végrehajtani.
A mellékelt alkalmazás mappájában elhelyeztünk egy Employees.mdb állományt, amely egy MS SQL Server Northwind adatbázisának Employees táblájának adatait tárolja egy MS ACCESS adathalmazban. Az adathalmazt elérhetjük úgy is, hogy linkelt szerverként a MS SQL Server-hez adjuk. Ennek módja kétféle lehet:
Első módszer, hogy a MS SQL Server Enterprise Manager segédprogramját használjuk, melyben grafikus eszközökkel adhatjuk az adatforrást a szerverhez.
Ekkor a Security – Linked Server pontot választva végezhetjük el a műveletet a felbukkanó panel megfelelő kitöltése után.
A másik módszer – amelyet alkalmazásunkban is használunk – az, hogy a sp_addlinkedserver eljárás segítségével a program indulásakor adjuk az erőforrást a szerverhez abban az esetben, ha ez még nem történt meg. Ezt a MASTER adatbázis sysservers táblájában ellenőrizhetjük.


Az AddLinkedServer tárolt eljárásunk a következőképpen fest:
Create procedure AddLinkedServer(@path varchar(150))
as
  DECLARE @linkedsource varchar(150)
  SELECT @linkedsource= datasource FROM master.dbo.sysservers WHERE providername = 'Microsoft.Jet.OLEDB.4.0'
  if (@path != @linkedsource)
  begin
    exec sp_addlinkedserver @server = 'MSACCESS FILE(Employees.mdb)', @provider = 'Microsoft.Jet.OLEDB.4.0', @srvproduct = 'OLE DB Provider for Jet', @datasrc = @path
  end
GO
Amennyiben a szerver még nem tartalmazza a fenti állományt, akkor a beépített tárolt eljárás meghívásra kerül. Paraméterei a következők:
  • Első paramétere a kapcsolt szerver neve.
  • Második paramétere a csatoló neve.
  • Harmadik paraméterként feltűntetjük a csatoló objektum nevét, mely a regisztrált COM objektum neve is egyben.
  • A negyedik paraméter tartalmazza az adatforrás elérési útvonalát.
Az OPENROWSET metódusban azt a módszert választottuk, hogy megadtuk az erőforrás eléréséhez szükséges információkat, valamint az állományban megtalálható EmployeeTable objektum nevét, és a metódus meghívását egy SQL utasításba ágyaztuk.
Ebben az esetben az OPENROWSET metódus szintaxisa a következő:
OPENROWSET(<provider neve>,
           <állomány neve és elérési útvonala>;
           <azonosító>;<jelszó>,
           <adatforrás objektumának neve>)
A metódust a következőképpen használtuk fel annak érdekében, hogy a hívó alkalmazásban a megadott dolgozói azonosítóhoz megkaphassuk a dolgozó teljes nevét:
string command = "SELECT a.FirstName + ' ' + a.LastName FROM OPENROWSET('Microsoft.Jet.OLEDB.4.0','" + Application.StartupPath + "\\Employees.mdb';'admin';'',EmployeeTable) AS a WHERE EmployeeID = " + comboBox2.Text;
A fenti parancsot pedig megadtuk az SqlCommand objektum CommandText property-jében.

Könyv
Ez a cikk megtalálható ebben a könyvben: C# Software Offline 2003 évkönyv 552. oldal

Felhasználási feltételek
A Software Online szoftverfejlesztői magazin mindegyik cikke, minden megjelent képe, és egyéb publikált anyaga szerzői jog védelme alatt áll! Bármilyen formában történő másodlagos terjesztésük, közzétételük vagy felhasználásuk kizárólag a kiadó előzetes írásbeli engedélyével történhet!

Copyright © 1999-2012 Animare Software Kft. Minden jog fenntartva!
| Készült: Animare Stúdió | Adatvédelem | Kapcsolat |