SQL İpuçları


Warning: count(): Parameter must be an array or an object that implements Countable in /home/kazimce1/public_html/wp-content/plugins/microkids-related-posts/microkids-related-posts.php on line 645

Bir tablodaki bir kolonun satırlarını tek bir text haline getirmek için aşağıdaki script ihtiyacımızı karşılayacaktır.

FirstName
Gustavo
Catherine
Kim

Örneğin Contact tablosunda bulunan FirstName kolonundaki bilgileri script çalıştırıldığında “Gustavo, Catherine, Kim” şeklinde görüntülenecektir.

DECLARE @Names VARCHAR(8000)
SELECT @Names = COALESCE(@Names + ', ', '') + ISNULL(FirstName, 'N/A') FROM Person.Contact

-- Veya

SELECT Stuff(
  (SELECT N', ' + FirstName FROM Person.Contact FOR XML PATH(''),TYPE) .value('text()[1]','nvarchar(max)'),1,2,N'')

Yukarıdaki işlemin tersini yapma ihtiyacı olduğunda ise aşağıdaki fonksiyon ile tekrar text halinden tablo haline dönüşüm gerçekleştirebilirsiniz.

--Kullanım
SELECT * FROM dbo.Split('Gustavo, Catherine,Kim',',')

--Script
CREATE FUNCTION [dbo].[Split](@STRING varchar(MAX), @Delimiter char(1))
RETURNS @Results TABLE (indx int, Items varchar(MAX))
AS

    BEGIN
    DECLARE @INDEX INT;DECLARE @SLICE varchar(MAX);
    SELECT @INDEX = 1;
    IF @STRING IS NULL RETURN
    DECLARE @i as int ;
    SET @i = 1;
    WHILE @INDEX !=0
        BEGIN
        	SELECT @INDEX = CHARINDEX(@Delimiter,@STRING)
        	IF @INDEX !=0
        		SELECT @SLICE = LEFT(@STRING,@INDEX - 1)
        	ELSE
        		SELECT @SLICE = @STRING
        	INSERT INTO @Results(indx, Items) VALUES(@i, @SLICE)
        	SELECT @STRING = RIGHT(@STRING,LEN(@STRING) - @INDEX)
        	IF LEN(@STRING) = 0 BREAK
            SET @i = @i + 1
        END
    RETURN
END
00002254465 gibi kayıtların başındaki sıfırları silebilmek için kullanılabilecek bir fonksiyon;
CREATE FUNCTION RemoveLeadingZerosFromVarChar
(
      @inputStr varchar(max)
)
RETURNS varchar(max)
AS
BEGIN
      DECLARE @Result varchar(max)
 
      SELECT @Result = replace(replace(ltrim(replace(
          replace(ltrim(@inputStr), ' ', '¬') 
          , '0', ' ') 
          ) 
          , ' ', '0') 
          , '¬', ' ') 
      RETURN @Result
END
GO
İki tarih arasındaki çalışma günlerini bulmak için kullanılabilecek script
CREATE FUNCTION dbo.GetWorkingDays
  ( @StartDate datetime,
    @EndDate datetime )
RETURNS INT
AS
BEGIN
  DECLARE @WorkDays int, @FirstPart int
  DECLARE @FirstNum int, @TotalDays int
  DECLARE @LastNum int, @LastPart int
  IF (DATEDIFF(day, @StartDate, @EndDate) < 2)
    BEGIN
      RETURN ( 0 )
    END
  SELECT
   @TotalDays = DATEDIFF(day, @StartDate, @EndDate) - 1,
   @FirstPart = CASE DATENAME(weekday, @StartDate)
                 WHEN 'Sunday' THEN 6
                 WHEN 'Monday' THEN 5
                 WHEN 'Tuesday' THEN 4
                 WHEN 'Wednesday' THEN 3
                 WHEN 'Thursday' THEN 2
                 WHEN 'Friday' THEN 1
                 WHEN 'Saturday' THEN 0
               END,
   @FirstNum = CASE DATENAME(weekday, @StartDate)
                 WHEN 'Sunday' THEN 5
                 WHEN 'Monday' THEN 4
                 WHEN 'Tuesday' THEN 3
                 WHEN 'Wednesday' THEN 2
                 WHEN 'Thursday' THEN 1
                 WHEN 'Friday' THEN 0
                 WHEN 'Saturday' THEN 0
               END
  IF (@TotalDays < @FirstPart)
     BEGIN
       SELECT @WorkDays = @TotalDays
     END
  ELSE
     BEGIN
       SELECT @WorkDays = (@TotalDays - @FirstPart) / 7
       SELECT @LastPart = (@TotalDays - @FirstPart) % 7
       SELECT @LastNum = CASE
         WHEN (@LastPart < 7) AND (@LastPart > 0) THEN @LastPart - 1
         ELSE 0
       END
       SELECT @WorkDays = @WorkDays * 5 + @FirstNum + @LastNum
     END
  RETURN ( @WorkDays )
END
GO

Kullanımı ;

SELECT dbo.GetWorkingDays ('2012-01-01', '2012-12-01')

0 thoughts on “SQL İpuçları”

Bir cevap yazın