Tuesday, December 21, 2010
ASP.NET Tips
Custom Validator With ClientValidation Property
Friday, December 17, 2010
Use Dynamic SQL to Improve Query Performance & Avoiding Sql Injections, sp_depends
Constructing SQL this way is not good, it leaves the procedure open to SQL Injection; little Bobby Tables might enter his name! Also, it does not allow the optimiser to reuse the execution plan. An example of how SQL Injection can be performed is given in the comments below:
A slightly better way to construct the WHERE clause and provide a little more protection is to double up the quotes in each parameter by calling SQL Server's Replace function e.g.:
Thursday, December 16, 2010
Linking to the Previous Row
declare @Items table
(ID int, Name VARCHAR(1000))
insert into @Items(ID,Name) values(1,'Vaccum Cleaner');
insert into @Items(ID,Name)values(2,'Washing Machine');
insert into @Items(ID,Name)values(3,'Tooth Brush');
declare @PriceHistory table(
ItemId int,
PriceStartDate datetime,
Price money
)
insert into @PriceHistory(ItemId,PriceStartDate,Price) values(1,'03/01/2004',250.00)
insert into @PriceHistory(ItemId,PriceStartDate,Price) values(1,'06/15/2005',219.99)
insert into @PriceHistory(ItemId,PriceStartDate,Price) values(1,'01/03/2007',189.00)
insert into @PriceHistory(ItemId,PriceStartDate,Price) values(1,'02/03/2007',200.00)
insert into @PriceHistory(ItemId,PriceStartDate,Price) values(2,'07/12/2006',650.00)
insert into @PriceHistory(ItemId,PriceStartDate,Price) values(2,'01/03/2007',550.00)
insert into @PriceHistory(ItemId,PriceStartDate,Price) values(3,'01/01/2005',1.99)
insert into @PriceHistory(ItemId,PriceStartDate,Price) values(3,'01/01/2006',1.79)
insert into @PriceHistory(ItemId,PriceStartDate,Price) values(3,'01/01/2007',1.59)
insert into @PriceHistory(ItemId,PriceStartDate,Price) values(3,'01/01/2008',1.49);
WITH PriceCompare AS (
SELECT i.ID, ph.ItemId, ph.PriceStartDate, ph.Price,
ROW_NUMBER() OVER (Partition BY ph.ItemId ORDER BY PriceStartDate) AS rownum
FROM @Items i INNER JOIN @PriceHistory ph
ON i.ID = ph.ItemId)
SELECT currow.ItemId, prevrow.Price AS PreviousPrice, currow.Price AS CurrentPrice, currow.PriceStartDate AS StartDate, nextrow.PriceStartDate AS EndDate
FROM PriceCompare currow
LEFT JOIN PriceCompare nextrow
ON currow.rownum = nextrow.rownum - 1
AND currow.ItemId = nextrow.ItemId
LEFT JOIN PriceCompare prevrow
ON currow.rownum = prevrow.rownum + 1
AND currow.ItemId = prevrow.ItemId
Wednesday, December 15, 2010
STR - for displaying the rounded decimal number
* It can only contain the maximum range of decimal value
* Eg: 9223372.14554 -> 9223372.15
DECLARE @Number FLOAT
SET @Number = 92233720.14554
SELECT ROUND(@Number,2)
Tuesday, December 14, 2010
Generating Subtotals using Subtotal(in a single query),Grouping
/* The GROUPING function is used as an additional column in the query, and this function will render the output value as '1' for the grand total row and '0' for the rest If we omit the ROLL UP the GROUPING function will not produce the desired output.
* A separate row for the total amount invested and total broker commission *amount under each scheme
* A separate row for the total amount invested and total broker commission *amount under each product
*A single row for the total amount invested and total broker commission amount *under all products.
*************************************************************************************/
//Method 1:
//Create a Sample Table and Data
DECLARE @GroupTest TABLE
(
Product_Name varchar(100),
Scheme_Name varchar(100),
Invest_Amount numeric(18,2),
Broker_Commission numeric(18,2),
Issue_Date datetime
)
declare @cnt int, @idx int, @index int
set @cnt = 1
set @idx = 1
set @index = 1
while @cnt <=100 begin insert into @GroupTest values ( 'Product'+CAST(@idx AS VARCHAR), 'Scheme'+CAST(@index AS VARCHAR), ((@cnt * @idx / @index)* 1524.15),((@cnt * @idx / @index)* 124.32), GETDATE() ) if @cnt % 10 = 0 set @idx = @idx + 1 set @index = @index + 1 if @cnt % 5 = 0 set @index = 1 set @cnt = @cnt + 1 end //Individual investment record
SELECT
Product_Name,
Scheme_Name,
Invest_Amount,
broker_commission,
'0 Detail' AS Comment
FROM
@GroupTest ORDER BY Product_Name,Scheme_Name,Comment
/*A separate row for the total amount invested and total broker commission amount under each scheme */
SELECT
Product_Name,
Scheme_Name,
SUM(Invest_Amount) AS 'Invest_Amount',
SUM(broker_commission) AS 'Broker_Commission',
'1 Scheme_Total'
FROM @GroupTest
GROUP BY Product_Name,Scheme_Name
ORDER BY Product_Name,Scheme_Name, Comment
/* A separate row for the total amount invested and total broker commission *amount under each product */
SELECT
Product_Name,
'ZTotal' AS Scheme_Name,
SUM(Invest_Amount) AS 'Invest_Amount',
SUM(broker_commission) AS 'Broker_Commission',
'2 Product_Total' AS Comment
FROM @GroupTest
GROUP BY Product_Name
ORDER BY Product_Name, Scheme_Name, Comment
/*A single row for the total amount invested and total broker commission amount under all products. */
SELECT
'ZProductTotal' As Product_Name,
'ZTotal' AS Scheme_Name,
SUM(Invest_Amount) AS 'Invest_Amount',
SUM(broker_commission) AS 'Broker_Commission',
'3 Grand_Total' AS Comment
FROM @GroupTest
ORDER BY Product_Name,Scheme_Name, Comment
/*Desired Output*/
SELECT
Product_Name,
Scheme_Name,
Invest_Amount,
broker_commission,
'0 Detail' AS Comment
FROM @GroupTest
UNION ALL
SELECT
Product_Name,
Scheme_Name,
SUM(Invest_Amount) AS 'Invest_Amount',
SUM(broker_commission) AS 'Broker_Commission',
'1 Scheme_Total' as Comment
FROM @GroupTest
GROUP BY Product_Name,Scheme_Name
UNION ALL
SELECT
Product_Name,
'ZTotal' AS Scheme_Name,
SUM(Invest_Amount) AS 'Invest_Amount',
SUM(broker_commission) AS 'Broker_Commission',
'2 Product_Total' AS Comment
FROM @GroupTest
GROUP BY Product_Name
UNION ALL
SELECT
'ZProductTotal' As Product_Name,
'ZTotal' AS Scheme_Name,
SUM(Invest_Amount) AS 'Invest_Amount',
SUM(broker_commission) AS 'Broker_Commission',
'3 Grand_Total' AS Comment
FROM @GroupTest
ORDER BY Product_Name,Scheme_Name, Comment
Using Ranking Functions to Deduplicate Data
// Output: A B C D E
// Create a sample test data
declare @AlphaList table (AlphaKey char); insert into @AlphaList(AlphaKey) values ('A'); insert into @AlphaList(AlphaKey) values ('A'); insert into @AlphaList(AlphaKey) values ('B'); insert into @AlphaList(AlphaKey) values ('B'); insert into @AlphaList(AlphaKey) values ('C'); insert into @AlphaList(AlphaKey) values ('D'); insert into @AlphaList(AlphaKey) values ('D'); insert into @AlphaList(AlphaKey) values ('E'); select AlphaKey from @AlphaList order by 1; //Returns the output : 1 A 2 A 3 B 4 B 5 C 6 D 7 D 8 E select ROW_NUMBER() over (order by AlphaKey) as RowNumber, AlphaKeyfrom @AlphaList; //Returns the output : 1 1 A 1 2 A 3 3 B 3 4 B 5 5 C 6 6 D 7 7 D 8 8 E select RANK() over (order by AlphaKey) as Rank, ROW_NUMBER() over (order by AlphaKey) as RowNumber, AlphaKeyfrom @AlphaList;
Monday, December 13, 2010
Usage of ISNUMERIC and how to create ISALLDIGITS functionality
/*
checks whether a number is Digits, Decimal, floating point, number, money
*/
// A point of summary
SELECT [Ascii Code] = STR(Number), [Ascii Character] = CHAR(Number), [ISNUMERIC Returns] = ISNUMERIC(CHAR(Number)) FROM Master.dbo.spt_ValuesWHERE Type = 'P' AND Number BETWEEN 0 AND 255 AND ISNUMERIC(CHAR(Number)) = 1 //Results SELECT ISNUMERIC(',') // returns 1 since the decimal contains ',' SELECT ISNUMERIC('$') // returns 1 since the money contain '$' SELECT ISNUMERIC('€') // returns 1 since the money contain '€' SELECT ISNUMERIC('£') // returns 1 since the money contain '£' SELECT ISNUMERIC('¥') // returns 1 since the money contain '¥' // so ISNUMERIC is not a permanent solution for checking ISALLDIGITS // ISALLDIGITS Snippet CREATE FUNCTION dbo.IsAllDigits/******************************************************************** Purpose: This function will return a 1 if the string parameter contains only numeric digits and will return a 0 in all other cases. Use it in a FROM clause along with CROSS APPLY when used against a table. --Siva Shunmugam ********************************************************************/ (@MyString VARCHAR(8000)) RETURNS TABLE AS RETURN ( SELECT CASE WHEN @MyString NOT LIKE '%[^0-9]%' THEN 1 ELSE 0 END AS IsAllDigits
Sunday, December 12, 2010
Sorting Months by Month Number.
IF OBJECT_ID('tempdb..#MyHead','U') IS NOT NULL
DROP TABLE #MyHead
SELECT TOP (1000000)
SomeDateTime = RAND(CHECKSUM(NEWID()))*7305 + CAST('2005' AS DATETIME),
SomeAmount = CAST(RAND(CHECKSUM(NEWID()))*100 AS MONEY)
INTO #MyHead
FROM master.sys.all_columns ac1
CROSS JOIN master.sys.all_columns ac2
;
/* Add a clustered index to the table just to keep it from being a heap
-- and to help with speed a bit by sorting the data.*/
CREATE CLUSTERED INDEX IX_#MyHead_SomeDateTime
ON #MyHead (SomeDateTime)
;
/* This doesnt sorts based on the Month Number */
SELECT [Month] = DATENAME(mm,SomeDateTime),
Amount = SUM(SomeAmount)
FROM #MyHead
WHERE SomeDateTime >= '2010' AND SomeDateTime < '2011'
GROUP BY DATENAME(mm,SomeDateTime)
;
/* The below sorts based on the Month Number */
SELECT [Month] = DATENAME(mm,SomeDateTime),
Amount = SUM(SomeAmount)
FROM #MyHead
WHERE SomeDateTime >= '2010' AND SomeDateTime < '2011'
GROUP BY DATENAME(mm,SomeDateTime)
ORDER BY CAST(DATENAME(mm,SomeDateTime) + ' 1900' AS DATETIME)
;
Saturday, December 11, 2010
Generating the top X rows from each group.
/* To display the records using Filter */
/* Create a temporary table */
CREATE TABLE #Runners
(
Runner integer NOT NULL,
Time integer NOT NULL,
Age integer NOT NULL
)
/* Insert sample records into the table*/
INSERT INTO #Runners
SELECT 1 , 10 , 20
UNION ALL
SELECT 2 , 15 , 20
UNION ALL
SELECT 3 , 11 , 20
UNION ALL
SELECT 4 , 12 , 30
UNION ALL
SELECT 5 , 18 , 30
UNION ALL
SELECT 6 , 9 , 40
UNION ALL
SELECT 7 , 16 , 40
UNION ALL
SELECT 8 , 13 , 30
UNION ALL
SELECT 9 , 13 , 30;
/* To retrieve the top X from each group using filter */
/* If both the time has the same time then the row number will be different for each same row */
with cteRunners
as
(
select * ,row_number() over (partition by Age order by Time ) as RowN
from #Runners
)
Select * from cteRunners
where RowN <=2
order by Age,Rown;
/* To give same row number for the same time present use DENSE_RANK */
with cteRunners
as
(
select *,DENSE_RANK() over (partition by Age order by Time ) as RowN
from
#Runners
)
Select * from cteRunners
where RowN <=2
order by Age,Rown
/* To drop the temporary table */DROP TABLE #Runners
/* Using CROSS APPLY */
IF OBJECT_ID('tempdb..#RunnersBig') IS NOT NULL drop table #RunnersBig/* Create a table and enter the millions of sample data for checking the performance */
Create Table #RunnersBig
(
RunnerId integer identity ,
Time integer not null,
Age integer not null
)
go
insert into #runnersbig ( Time , Age )
select top 1000000 ABS ( checksum ( newid ()))% 1000 ,
ABS ( checksum ( newid ()))% 99
from sys . columns a cross join sys . columns b cross join sys . columns c
go/* Create a Index */
create index idxrunnersbig on #runnersbig ( age , time ) include ( runnerid );
with cteN
as
(
select distinct Age number from #RunnersBig
)
Select *
from cteN cross apply ( Select top ( 2 ) * from #RunnersBig where #RunnersBig . Age = cteN . number order by Time ) as runners
order by cteN . number , runners . Time
Friday, July 30, 2010
Retrieving the checked elements from the RADGrid
Thursday, July 29, 2010
Button click event not firing in RadTabStrip ?
Tuesday, February 2, 2010
Calender popup
-----------
btnProjectStartDt.Attributes.Add("onclick", "javascript:popUpCalendar(this,txtProjectStartDt,'dd/mm/yyyy');return false;");
filling the dataset in the report
--------------------------------
string constr = ConfigurationManager.ConnectionStrings["Reports"].ConnectionString;
SqlConnection con = new SqlConnection(constr);
SqlCommand cmd = new SqlCommand("CrossTab", con);
ReportDocument rpt = new ReportDocument();
SqlDataAdapter adap = new SqlDataAdapter(cmd);
DataSet ds = new DataSet();
try
{
cmd.CommandType = CommandType.StoredProcedure;
cmd.Parameters.Add("@StartDate", SqlDbType.VarChar).Value = DateTime.Parse(txtProjectStartDt.Text, new CultureInfo("en-GB")).ToString("d", new CultureInfo("en-US"));
cmd.Parameters.Add("@Enddate", SqlDbType.VarChar).Value = DateTime.Parse(txtProjectEndDt.Text, new CultureInfo("en-GB")).ToString("d", new CultureInfo("en-US"));
adap.Fill(ds, "Orders");
if (ds != null)
{
if (ds.Tables[0].Rows.Count > 0)
{
rpt.Load(Server.MapPath("CR.rpt"));
rpt.SetDataSource(ds.Tables[0]);
crvCrossTab.ReportSource = rpt;
crvCrossTab.DataBind();
crvCrossTab.Visible = true;
}
else
{
Response.Write("No Record Exist");
crvCrossTab.Visible = false;
}
}
}
catch (Exception ex)
{
throw ex;
}
finally
{
con.Close();
con = null;
}
Displaying the data in GridView
SqlConnection con = new SqlConnection(constr);
SqlCommand cmd = new SqlCommand("Matrix", con);
SqlDataAdapter adap = new SqlDataAdapter(cmd);
DataSet ds = new DataSet();
try
{
cmd.CommandType = CommandType.StoredProcedure;
CultureInfo ci = new CultureInfo("en-US");
cmd.Parameters.Add("@StartDate", SqlDbType.VarChar).Value = DateTime.Parse(txtProjectStartDt.Text, new CultureInfo("en-GB")).ToString("d", new CultureInfo("en-US"));
cmd.Parameters.Add("@Enddate", SqlDbType.VarChar).Value = DateTime.Parse(txtProjectEndDt.Text, new CultureInfo("en-GB")).ToString("d", new CultureInfo("en-US"));
adap.Fill(ds, "Orders");
if (ds != null)
{
if (ds.Tables[0].Rows.Count > 0)
{
gvCrossTab.DataSource = ds.Tables[0];
gvCrossTab.PageSize =10;
gvCrossTab.DataBind();
}
else
{
Response.Write("No Record Exist");
}
}
}
catch (Exception ex)
{
throw ex;
}
finally
{
con.Close();
con = null;
}