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')
Bir cevap yazın
Yorum yapabilmek için giriş yapmalısınız.