Luc

Csőhalmadár!

T-SQL és a reguláris kifejezések

T-SQL-ben is használhatjuk a reguláris kifejezéseket, csak némi hegesztést igényel a dolog.
 Hozzunk létre egy Class Library-t, valami ilyesmi tartalommal:
using System.Text.RegularExpressions;
using Microsoft.SqlServer.Server;

namespace LunirSqlExtensions
{
    
    public class SqlRegex
    {
        [SqlFunction(IsDeterministic=true, IsPrecise=true)]
        public static bool IsMatch(string inputfield, string pattern)
        {
            return Regex.IsMatch(inputfield, pattern);
        }
    }
}
Fontos, hogy 3.5 framework-re buildeljünk, különben az SQL szerver beszól, legalább is a 2008 R2. Ebből lesz egy DLL, amit használni tudunk SQL-ből, némi előkészítés után:
sp_configure 'clr enabled', 1
go
reconfigure
go
create ASSEMBLY LunirSqlExtensions from 'x:\SqlExt\LunirSqlExtensions.dll' with PERMISSION_SET = SAFE
go
create function [dbo].[LunirRegexIsMatch] (@inputfield [nvarchar](MAX), @pattern [nvarchar](255)) RETURNS [BIT] with execute as caller AS EXTERNAL NAME LunirSqlExtensions.[LunirSqlExtensions.SqlRegex].[IsMatch]
go
Ez pedig a használata:
select dbo.LunirRegexIsMatch('a','a')
Tudom, hogy nem a legvilágrengetőbb az 'a' stringen alkalmazni az 'a' reguláris kifejezést, de példának megfelel :)

Teljes hónap lekérdezése

Ha egy táblából szeretnénk egy teljes hónap eseményeit megszerezni, de úgy, hogy az eseménytelen napok is kerüljenek kilistázásra, arra itt egy módszer:
with nums (i) as ( select i = 0 union all select i + 1 from nums where i < 100 )
    select a.dte, COUNT (d.[Date])
    from
        (select dte = dateadd(dd,nums.i,@StartDate) from nums) a
    left  join
        [valamilyentabla] d
    on
        DATEADD(DAY, 0, DATEDIFF(DAY, 0, d.[Date])) = DATEADD(DAY, 0, DATEDIFF(DAY, 0, a.dte))
    where a.dte <= @EndDate
    group by a.dte
    order by a.dte
Természetesen ez nem csak egyetlen hónapra alkalmas, illetve nem csak napokra, hanem akár órákra, vagy hónapokra is lehet bontani a kívánt időszakot. A JOIN feltételben ekkor nem DAY intervallumot kell használni, hanem azt, ami éppen tetszik, YEAR, MINUTE, akármi.
A megoldás ötletét innen vettem: http://www.sqlteam.com/

Application pool identity használata

Az application pool identity használata GUI-ból elég nagy szívás, legalább is Windows 2008 R2 alatt. Történetesen nem igazán lehet akár file rendszerhez, akár adatbázishoz kötni őket. Parancssorból viszont egyszerű. A folder1-re adhatunk mindenféle jogokat ezzel:
icacls c:\inetpub\wwwroot\webapp\folder1 /grant "IIS AppPool\valamilyenappoolnev":(OI)(CI)(IO)(R,W,D,DC,X)
Az (OI)(CI)(IO) paraméterek azt mondják meg, hogy nem a kérdéses könyvtárra adunk jogokat, hanem az összes alatta lévő könyvtárra és állományra. A többi paraméter az írás, olvasás, törlés, és gyermekelem törlése engedélyek. Ha épp nem ezek a jogok kellenek, akkor a help megmondja a többit, viszont ez után a parancs után már GUI-ból is tudjuk a jogokat osztogatni.
Az SQL (2008 R2) adatbázishoz pedig így tudunk logint létrehozni:
create login [IIS AppPool\valamilyenappoolnev] from windows with default_database=[adatbazisnev] use [adatbazisnev] create user [IIS AppPool\valamilyenappoolnev] for login [IIS AppPool\valamilyenappoolnev]
Ez utóbbi, ha minden igaz mehet GUI-ból is, csak ne nyomjunk "check names"-t. Nem, nem mehet... Viszont a Windows 2012-ben már nem okoz ez fejfájást, simán fel fogja ismerni az AppPool-os azonosítókat.

SQL tábla mezőinek feltöltése növekvő értékekkel

Ha egy utólag hozzáadott mezőt szeretnék feltölteni növekményes értékekkel, de valami miatt nem akarok constraint-t létrehozni, akkor T-SQL esetében a legegyszerűbb megoldás a következő.
DECLARE @sorszam INT = 0;
UPDATE [firg] SET @sorszam = [ujmezo] = @sorszam + 10;