How to convert mysql query into SQL Server query? - sql-server

How to covert mysql query into mssql query?
SELECT name FROM user LIMIT 5, 10
I have known that mssql don't support 'limit'...
But I have to use limit!
How to covert mysql query into SQL Server query?

Try out this
SELECT * FROM (
SELECT *, ROW_NUMBER() OVER (ORDER BY name) as row FROM sys.databases
) a WHERE a.row > 5 and a.row <= 10
You can achieve your concept.

select * from
(select name , ROW_NUMBER() over(order by name) rn from user ) a
where rn > 5 and rn<= 15

There is no way to translate this, but there is a bit of workaround here on SO.
Check this out.

Related

SQL Server 2008

I have this query from mysql
SELECT *
FROM table
LIMIT 100, 200
Now how do I write similar query in SQL Server 2008. Basically I'm using php and SQL Server as backend and need to display records in range (1-100 then 100-200)
Try this:
SELECT *
FROM
(SELECT
SomeColumn, ...,
ROW_NUMBER() OVER (ORDER BY SomeColumn) AS RowNumber
FROM
table) Aux
WHERE
RowNumber >= #start AND RowNumber < (#start + #length)
Notes: You need mandatory order by a column and also you have to make a subquery to get access to RowNumber in the WHERE clause
You can try this approach:
SELECT ID, ItemID, ItemName, UnitCost, UnitPrice
FROM
(
SELECT ID, ItemID, ItemName, UnitCost, UnitPrice,
ROW_NUMBER() OVER (ORDER BY UnitCost) AS Seq
FROM dbo.Inventory
)t
WHERE Seq BETWEEN 100 AND 200
you will basically use row_number to fetch they information that you need.

Offset/Fetch based paging (Implementation) in EntityFramework (Using LINQ) for SQL Server 2008

I am using SQL Server 2008 and Entity Framework 6.1.3. I wish to implement pagination of data based on OFFSET/FETCH rather than Take() & Skip().
I searched online with no luck. Some posts suggested migrating to SQL Server 2012. Which is not an option in my case.
Can someone suggest how to use OFFSET/FETCH with SQL Server 2008 and EF 6.1.3
This is possible with Entity Framework 6.1.2 and above so you should be OK to use it in your project. The standard Skip and Take methods can't be captured in the same way as others. There are now two additional overload of the Skip/Take methods that take lambdas, so instead of this:
var results = context.MyTable
.Skip(10)
.Take(5);
Do this:
var results = context.MyTable
.Skip(() => 10)
.Take(() => 5);
The fix is to modify your EDMX file, using the XML editor, and change the value of ProviderManifestToken from 2012 to 2008. I found that on line 7 in my EDMX file. After saving that change, the paging SQL will be generated using the “old”, SQL Server 2008 compatible syntax.
This example may helps you to use OffSET In Sql server
DECLARE #PageNo INT=NULL,
#RowsPerPage INT=2
;WIth cte(id, name, qty, price)
AS
(
SELECT 2,'a', 2, 20 UNION ALL
SELECT 3,'d', 2, 10 UNION ALL
SELECT 4,'b', 3, 60
)
,cte2 AS (SELECT id, name, qty, price , 1 AS n FROM cte
UNION ALL
SELECT id, name, qty, price , n+1 From cte2 t
WHERE n< t.qty
)
SELECT
ROW_NUMBER() OVER (ORDER BY (SELECT 1) ) AS Seq,
id,
name,
qty,
price
FROM cte2
ORDER BY 2, 3, n
OFFSET (COALESCE((CASE WHEN #PageNo <= 0 THEN 1
WHEN #PageNo > 0 THEN #PageNo END), 1) - 1) ROWS
FETCH NEXT #RowsPerPage ROWS ONLY

SQL Server 2008 - How to show rows between 1001 to 2000

I am using SQL Server 2008. With help of TOP clause in SQL Server I have run following query to display the first 1000 rows from my table Department
Select TOP 1000 *
from Department;
Now I need to display the next 1000 data from the same table. Can anybody help me to find a solution for the this?
You can use the ROW_NUMBER function to get the number of the row, and then take the numbers from X to Y. Below query is assuming that you want the results ordered by ID:
WITH OrderedDepartments AS
(
SELECT ID, Name,
ROW_NUMBER() OVER (ORDER BY ID) AS RowNumber
FROM Department
)
SELECT ID, Name
FROM OrderedDepartments
WHERE RowNumber BETWEEN 1001 AND 2000;
you can try something like:
SELECT *
FROM (
SELECT *, ROW_NUMBER() OVER (ORDER BY DEPARTMENT_NAME) AS rownum
FROM DEPARTMENT
) AS t
WHERE t.rownum BETWEEN 1001 AND 2001
Best way is use "FETCH (Transact-SQL)", more info and sample available in following link,
FETCH (Transact-SQL)

How I can limit result in SQL Server?

I have table containing data for users, I need to get only last 2 users after first user ex
id-username
1-john
2-fredrek
3-sara
4-sarah
I need to get fredrek, sara - how do I do this in SQL Server ??
I know to do that with MySQL I use LIMIT1,2 but with SQL Server I can't
To avoid 2 x TOP you can use ROW_NUMBER (note: you can't use ROW_NUMBER output directly in the WHERE clause of a single statement )
;WITH cRN AS
(
SELECT
ROW_NUMBER() OVER (ORDER BY id) AS rn,
username
FROM
mytable
)
SELECT username
FROM cRN
WHERE rn BETWEEN 2 AND 3
You can use TOP, restricting in the WEHRE clause, not to take the first register
SELECT TOP 2 *
FROM MyTable
WHERE Id > 1
With SQL Server, you can use the TOP command.
You have to make a dual query:
select * from ( select top 10 * from (
select top 20 * from table_name order by 1 asc
) as tb_name order by 1 desc
) as tb_name_last
order by whathever;
You can use TOP in T-SQL:
SELECT TOP 2 FROM table_name

What's the best method to do paging in my ASP page

What's the best method to do paging in my ASP page when displaying a list of items?
I knew that there is no equivalent to MySQL's LIMIT clause present in SQL Server, either 2000 or 2005.
How can I retrieve some particular records (Records 20 to 30) from the DB?
Do i need to fetch all the records from the database and do something in my ASP page to display the required records?
Whats the best method to do paging in my ASP page when displaying a list of items ?
I just want to add one more feature to Mr. Wheat's answer. Why not u are trying to use the Take () and Skip() feature of linq(obviously if u are using dotnet framework 3.5+)
It is indeed helpful while working with large datasets.
Have a look
Using Take and Skip method in LINQ queries
I knew that there is no MySQL LIMIT clause present in SQL server(both 2000 and 2005 should support).how can i retrieve some particular records (Record 20 -30) from DB ?
You can do this in SQLSERVER 2005+ by using ranking function Row_Number() among other alternatives. A sample example is included herewith
First I am creating a dummy table and inserting some 50 records
declare #tbl table(name varchar(50),age int)
;with num_cte as
( select 1 as rn
union all
select rn+1 from num_cte where rn<50
)
insert #tbl
select names ,rn + 20 ageval
from num_cte
cross apply( select 'name' + CAST(rn as varchar(2)) AS names) names
select * from #tbl
Now by using the Row_Number() function I am picking up records between 20 & 30
select name,age from(
select ROW_NUMBER()over (order by age) as rownum,name,age from #tbl) X
where X.rownum between 20 and 30
However, for achieving the same in SQL SERVER 2000 the below query will help
select name,age from(
select t1.name,t1.age,
(select count(*)+1 from #tbl where name<>t1.name and age<=t1.age) rownum
from #tbl t1
)X(name,age,rownum)
where rownum between 20 and 30
Please see:
Paging In ASP.NET
Data Access Tutorials
GridView Examples for ASP.NET 2.0: Paging and Sorting the GridView's Data
SQL Server 2005 Paging – The Holy Grail
Youd need to use ROW_NUMBER (SQL Server 2005+)
SELECT * FROM
(SELECT a.*, ROW_NUMBER() OVER (ORDER BY hire_date) rn
FROM hr.employees AS OF TIMESTAMP (TIMESTAMP '2009-01-29 10:30:00') a)
WHERE rn BETWEEN 10 AND 19
Related answer
Using ROW_NUMBER, you are numering and sorting the inherently unsorted group (the table). Once you have an ordered set instead of just a set, you can now the sentence "I want all the rows from 10 to 19" makes sense.
You will have to use ASP code to keep both the upper and lower elements, so you can ask for the next or previous subset of rows to show.

Resources