在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 
+4

那么......你没有在你的代码中使用你的参数。但更大的担忧是,你在这里试图做什么并不是很清楚。你是否试图传递列的名称作为订单使用?如果是这样,你应该改变数据类型为sysname而不是nvarchar(15)。要实际完成这项工作,您必须使用动态SQL,这意味着您需要注意SQL注入。鲍比桌子喜欢参观这样的程序。 –

+0

@SeanLange,这是正确的,正是我想要做的。 – Suehil2k

小的动态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 
+3

这项工作,但有几个问题。首先是sql注入的可能性。您应该将参数包装在QUOTENAME中。第二个问题是,如果不传递值,则使用不推荐使用的功能。当没有传入参数时,它将按顺序排序1. –

+0

很棒的帮助哦,明智的oracles,我将nvarchar(15)更改为sysname作为提示,并且存储过程的所有内容都很好 – Suehil2k

+0

@ 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