在SQL Server中创建存储过程
我试图创建一个存储过程,将采用ORDER BY <Country>
作为参数,以返回该国家/地区列的查询顺序。我迄今为止创造的东西有点粗糙,任何帮助都会很感激!在SQL Server中创建存储过程
USE AdventureWorks2014
GO
CREATE PROCEDURE dbo.uspSort @CCountry nvarchar(15)
AS
SELECT
ContactName, CompanyName, Region, Country
FROM
dbo.Customers
ORDER BY
Country
GO
小的动态SQL可以帮助
CREATE PROCEDURE dbo.uspSort (@CCountry nvarchar(15) = '1')
AS
Declare @SQL varchar(max)
Set @SQL = 'SELECT ContactName, CompanyName, Region, Country FROM dbo.Customers ORDER BY '[email protected]
Exec(@SQL)
GO
这项工作,但有几个问题。首先是sql注入的可能性。您应该将参数包装在QUOTENAME中。第二个问题是,如果不传递值,则使用不推荐使用的功能。当没有传入参数时,它将按顺序排序1. –
很棒的帮助哦,明智的oracles,我将nvarchar(15)更改为sysname作为提示,并且存储过程的所有内容都很好 – Suehil2k
@ Suehil2k确保您将该参数包裹在QUOTENAME中或全部不好....但。 –
您可以通过使用case语句,如果你不想做动态SQL命令。 case语句的所有结果都必须是相同的数据类型(看起来它们都是您的情况下的所有字符串,但请注意,如果您混合使用int和varchar列,则会出现错误)。
CREATE PROCEDURE dbo.uspSort @OrderColumn nvarchar(15)
AS
SELECT
ContactName, CompanyName, Region, Country
FROM
dbo.Customers
ORDER BY
case @OrderColumn
when 'Country' then Country
when 'ContactName' then ContactName
when 'Region' then Region
when 'CompanyName' then CompanyName
else ''
end
GO
那么......你没有在你的代码中使用你的参数。但更大的担忧是,你在这里试图做什么并不是很清楚。你是否试图传递列的名称作为订单使用?如果是这样,你应该改变数据类型为sysname而不是nvarchar(15)。要实际完成这项工作,您必须使用动态SQL,这意味着您需要注意SQL注入。鲍比桌子喜欢参观这样的程序。 –
@SeanLange,这是正确的,正是我想要做的。 – Suehil2k