BEGIN TRY
BEGIN TRAN
--put queries here
COMMIT;
END TRY
BEGIN CATCH
IF @@TRANCOUNT>0
BEGIN
SELECT @@ERROR,ERROR_MESSAGE ( )
ROLLBACK;
END
END CATCH
any one can use above code to manage transaction as well as error handling in sql server.
Discover innovative solutions, best practices, and cutting-edge technologies in enterprise architecture
--First of all create one temp table DECLARE @t TABLE(ID INT IDENTITY, Data VARCHAR(1000)) --insert the sample data INSERT INTO @t SELECT 'yogesh bhadauriya' --use the Common table expression ;with CTE AS ( --anchor query where we are finding the first character for replacing with uppercase SELECT Cast(STUFF(LOWER(Data), 1, 1, UPPER(LEFT(Data, 1))) As varchar(max)) As Data, PATINDEX('%[^a-zA-Z][a-z]%', Data COLLATE Latin1_General_Bin) As Position,ID,Data As OldData From @t Union All --recursive query SELECT Cast(STUFF(CTE.Data, Position, 2, UPPER(SUBSTRING(CTE.Data, CTE.Position, 2))) As Varchar(max)) as Data, Cast(PATINDEX('%[^a-zA-Z][a-z]%', CTE.Data COLLATE Latin1_General_Bin) As Int) As Position,CTE.ID,T.Data As OldData From @t As T Inner Join CTE On CTE.ID=CTE.ID where CTE.Data is not null ) Select ID,OldData As Data,Data As Results From CTE where Data is not null and Position=0 ---output --Id Data Results --1 yogesh bhadauriya Yogesh Bhadauriya
--create the following function CREATE FUNCTION dbo.udf_Num_ToWords ( @Number Numeric (38, 0) -- Input number with as many as 18 digits ) RETURNS VARCHAR(8000) /* * Converts a integer number as large as 34 digits into the * equivalent words. The first letter is capitalized. * * Attribution: Based on NumberToWords by Srinivas Sampath * as revised by Nick Barclay * * Example: select dbo.udf_Num_ToWords (1234567890) + CHAR(10) + dbo.udf_Num_ToWords (0) + CHAR(10) + dbo.udf_Num_ToWords (123) + CHAR(10) select dbo.udf_Num_ToWords(76543210987654321098765432109876543210) DECLARE @i numeric (38,0) SET @i = 0 WHILE @I <= 1000 BEGIN PRINT convert (char(5), @i) + convert(varchar(255), dbo.udf_Num_ToWords(@i)) SET @I = @i + 1 END * * Published as the T-SQL UDF of the Week Vol 2 #9 2/17/03 ****************************************************************/ AS BEGIN DECLARE @inputNumber VARCHAR(38) DECLARE @NumbersTable TABLE (number CHAR(2), word VARCHAR(10)) DECLARE @outputString VARCHAR(8000) DECLARE @length INT DECLARE @counter INT DECLARE @loops INT DECLARE @position INT DECLARE @chunk CHAR(3) -- for chunks of 3 numbers DECLARE @tensones CHAR(2) DECLARE @hundreds CHAR(1) DECLARE @tens CHAR(1) DECLARE @ones CHAR(1) IF @Number = 0 Return 'Zero' -- initialize the variables SELECT @inputNumber = CONVERT(varchar(38), @Number) , @outputString = '' , @counter = 1 SELECT @length = LEN(@inputNumber) , @position = LEN(@inputNumber) - 2 , @loops = LEN(@inputNumber)/3 -- make sure there is an extra loop added for the remaining numbers IF LEN(@inputNumber) % 3 <> 0 SET @loops = @loops + 1 -- insert data for the numbers and words INSERT INTO @NumbersTable SELECT '00', '' UNION ALL SELECT '01', 'one' UNION ALL SELECT '02', 'two' UNION ALL SELECT '03', 'three' UNION ALL SELECT '04', 'four' UNION ALL SELECT '05', 'five' UNION ALL SELECT '06', 'six' UNION ALL SELECT '07', 'seven' UNION ALL SELECT '08', 'eight' UNION ALL SELECT '09', 'nine' UNION ALL SELECT '10', 'ten' UNION ALL SELECT '11', 'eleven' UNION ALL SELECT '12', 'twelve' UNION ALL SELECT '13', 'thirteen' UNION ALL SELECT '14', 'fourteen' UNION ALL SELECT '15', 'fifteen' UNION ALL SELECT '16', 'sixteen' UNION ALL SELECT '17', 'seventeen' UNION ALL SELECT '18', 'eighteen' UNION ALL SELECT '19', 'nineteen' UNION ALL SELECT '20', 'twenty' UNION ALL SELECT '30', 'thirty' UNION ALL SELECT '40', 'forty' UNION ALL SELECT '50', 'fifty' UNION ALL SELECT '60', 'sixty' UNION ALL SELECT '70', 'seventy' UNION ALL SELECT '80', 'eighty' UNION ALL SELECT '90', 'ninety' WHILE @counter <= @loops BEGIN -- get chunks of 3 numbers at a time, padded with leading zeros SET @chunk = RIGHT('000' + SUBSTRING(@inputNumber, @position, 3), 3) IF @chunk <> '000' BEGIN SELECT @tensones = SUBSTRING(@chunk, 2, 2) , @hundreds = SUBSTRING(@chunk, 1, 1) , @tens = SUBSTRING(@chunk, 2, 1) , @ones = SUBSTRING(@chunk, 3, 1) -- If twenty or less, use the word directly from @NumbersTable IF CONVERT(INT, @tensones) <= 20 OR @Ones='0' BEGIN SET @outputString = (SELECT word FROM @NumbersTable WHERE @tensones = number) + CASE @counter WHEN 1 THEN '' -- No name WHEN 2 THEN ' thousand ' WHEN 3 THEN ' thousand ' WHEN 4 THEN ' billion ' WHEN 5 THEN ' trillion ' WHEN 6 THEN ' quadrillion ' WHEN 7 THEN ' quintillion ' WHEN 8 THEN ' sextillion ' WHEN 9 THEN ' septillion ' WHEN 10 THEN ' octillion ' WHEN 11 THEN ' nonillion ' WHEN 12 THEN ' decillion ' WHEN 13 THEN ' undecillion ' ELSE '' END + @outputString END ELSE BEGIN -- break down the ones and the tens separately SET @outputString = ' ' + (SELECT word FROM @NumbersTable WHERE @tens + '0' = number) + '-' + (SELECT word FROM @NumbersTable WHERE '0'+ @ones = number) + CASE @counter WHEN 1 THEN '' -- No name WHEN 2 THEN ' thousand ' WHEN 3 THEN ' million ' WHEN 4 THEN ' billion ' WHEN 5 THEN ' trillion ' WHEN 6 THEN ' quadrillion ' WHEN 7 THEN ' quintillion ' WHEN 8 THEN ' sextillion ' WHEN 9 THEN ' septillion ' WHEN 10 THEN ' octillion ' WHEN 11 THEN ' nonillion ' WHEN 12 THEN ' decillion ' WHEN 13 THEN ' undecillion ' ELSE '' END + @outputString END -- now get the hundreds IF @hundreds <> '0' BEGIN SET @outputString = (SELECT word FROM @NumbersTable WHERE '0' + @hundreds = number) + ' hundred ' + @outputString END END SELECT @counter = @counter + 1 , @position = @position - 3 END -- Remove any double spaces SET @outputString = LTRIM(RTRIM(REPLACE(@outputString, ' ', ' '))) SET @outputstring = UPPER(LEFT(@outputstring, 1)) + SUBSTRING(@outputstring, 2, 8000) RETURN @outputString -- return the result END
--now run the following query to get the result select dbo.udf_Num_ToWords(5800000) --output --Five thousand eight hundred thousand
--here we are creating the table variable so that we can insert some dummy record Declare @Table Table ( TId int, ParentId int, Name varchar(10) ) --inserting some records --using the union all to insert more than one records insert into @Table Select 1,NULL,'ICT' Union All Select 2,1,'ICT-M1' Union All Select 4,1,'ICT-M2' Union All Select 7,2,'ICT-M1U1' Union All Select 8,2,'ICT-M1U2' Union All Select 9,4,'ICT-M2U1' Union All Select 10,4,'ICT-M2U2' Union All Select 11,7,'ICT-M1U1P1' Union All Select 12,7,'ICT-M1U1P2' Union All Select 13,8,'ICT-M1U2P1' Union All Select 14,8,'ICT-M1U2P2' Union All Select 15,9,'ICT-M2U1P1' Union All Select 16,9,'ICT-M2U1P2' Union All Select 17,10,'ICT-M2U2P1' Union All Select 18,10,'ICT-M2U2P2' --variable to hold data Declare @ChildNode varchar(1000) Set @ChildNode=''; --use the standard recursive query ;with [CTE] as ( --anchor query where we are finding the all parents select TId,ParentId,Name,CAST(ISNULL(CAST(ParentId as varchar(10)),'0') As Varchar(100)) As ChildNode from @Table c where c.[ParentId] is null union all --recursive query where we are finding the all child according to anchor query parent select c.TId,c.ParentId,c.Name, CAST( p.ChildNode +','+cast(c.TId as varchar(10) ) As Varchar(100)) As ChildNode from [CTE] p, @Table c where c.[ParentId] = p.[TId] ) --select the child node as per the id --Assigin the all Ids into one variable select @ChildNode=@ChildNode+','+Cast(TId as varchar(10)) from [CTE] Cross Apply dbo.Split(ChildNode,',') where items=9 order by TId select SUBSTRING(@ChildNode,2,LEN(@ChildNode)) --outpu --2,7,8,11,12,13,14 ---- --create the tabular function to split the multi valued into table Create FUNCTION [dbo].[Split](@String varchar(8000), @Delimiter char(1)) returns @temptable TABLE (items varchar(8000)) as begin declare @idx int declare @slice varchar(8000) select @idx = 1 if len(@String)<1 or @String is null return while @idx!= 0 begin set @idx = charindex(@Delimiter,@String) if @idx!=0 set @slice = left(@String,@idx - 1) else set @slice = @String if(len(@slice)>0) insert into @temptable(Items) values(@slice) set @String = right(@String,len(@String) - @idx) if len(@String) = 0 break end return end
--
Happy Coding
DECLARE @idoc int DECLARE @doc varchar(max) SET @doc =' <ROOT> <Trans TransId="1" Add="false" Edit="true" Delete="true" View="true" Block="false"> </Trans> <Trans TransId="2" Add="1" Edit="1" Delete="1" View="1" Block="0"> </Trans> </ROOT>' --Create an internal representation of the XML document. EXEC sp_xml_preparedocument @idoc OUTPUT, @doc -- Execute a SELECT statement that uses the OPENXML rowset provider. SELECT * Into #TempTable FROM OPENXML(@idoc, '/ROOT/Trans',1) WITH ( TransId varchar(10), [Add] bit, Edit bit, [Delete] bit, [View] bit, Block bit ) Select * From #TempTable drop table #TempTable
--
happy coding
for (int i = 0; i < 100000; i++) ;
int i=0; while (i < 100000) i++;
The foreach loop has a slightly different purpose. It is meant for itterating through some collection that implements IEnumerable. It's performance is much slower, my test resulted in 0.0009076 seconds with this code:
int[] test = new int[100000]; foreach (int i in test) ;
IL_0000: nop IL_0001: ldc.i4.0 IL_0002: stloc.0 IL_0003: br.s IL_0009 IL_0005: ldloc.0 IL_0006: ldc.i4.1 IL_0007: add IL_0008: stloc.0 IL_0009: ldloc.0 IL_000a: ldc.i4 0x186a0 IL_000f: clt IL_0011: stloc.1 IL_0012: ldloc.1 IL_0013: brtrue.s IL_0005
IL_0000: nop IL_0001: ldc.i4.0 IL_0002: stloc.0 IL_0003: br.s IL_0009 IL_0005: ldloc.0 IL_0006: ldc.i4.1 IL_0007: add IL_0008: stloc.0 IL_0009: ldloc.0 IL_000a: ldc.i4 0x186a0 IL_000f: clt IL_0011: stloc.1 IL_0012: ldloc.1 IL_0013: brtrue.s IL_0005
foreach
statement is actually quite dangerous. In fact, I may swear off its use entirely. Why? Two reasons: (1) performance, and (2) predictability. foreach
is slower than with for
. I can't remember where I first learned that, perhaps in Patterns & Practices: Improving .Net Application Performance. Maybe it was from personal experience. How much slower? Well, I suppose that depends on your particular circumstances. Here are a few interesting references:foreach
loopThe foreach statement is used to iterate through the collection to get the desired information, but should not be used to change the contents of the collection to avoid unpredictable side effects
.
What's that all about? Let's take this as an example:foreach(MyClass myObj in ListLooking deeper into the C# Language Specification... the iteration variable is supposed to be read-only, though apparently that doesn't stop you from updating a property of an object. Thus for instance it would be illegal to assign a new value to)
myObj
, but not to assign a new value to myObj.MyProperty
. foreach
whenever you want so long as you don't update the values. In my experience that's hogwash — most of the code I work on goes into environments where performance is extremely important. Besides, writing a for statement requires very little extra coding compared to a foreach
statement. Furthermore, if you have a lot going on inside your iteration block, it can be easy to forget and accidentally update the iteration variable inside a foreach
loop. Thus do I conclude: just avoid foreach
altogether.public DataTable ListToDataTable(IEnumerable list) { var dt = new DataTable(); foreach (var info in typeof(T).GetProperties()) { dt.Columns.Add(new DataColumn(info.Name, info.PropertyType)); } foreach (var t in list) { var row = dt.NewRow(); foreach (var info in typeof(T).GetProperties()) { row[info.Name] = info.GetValue(t, null); } dt.Rows.Add(row); } return dt; }
Declare @Date1 datetime Declare @Date2 datetime Select @Date1 = '15Feb1971'Select @Date2 = '08Dec2009'select CASE WHEN dateadd(year, datediff (year, @Date1, @Date2), @Date1) > @Date2 THEN datediff (year, @Date1, @Date2) - 1 ELSE datediff (year, @Date1, @Date2)END as Age
--
happy coding
DBCC CHECKIDENT ('tablename', NORESEED)
For instance, if I wanted to check the next ID value of my orders table, I could use this command:
DBCC CHECKIDENT (orders, NORESEED)
To set the value of the next ID to be 1000, I can use this command:
DBCC CHECKIDENT ('databasename.dbo.orders',RESEED, 999)