2016-06-07 3 views
-1

Я пытаюсь создать хранимую процедуру, которая примет параметр 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

ответ

1

Небольшой динамический 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

Великая помощь о мудрых оракулах, я изменил nvarchar (15) на sysname как советую, и все хорошо в земле хранимой процедуры – Suehil2k

+0

@ Suehil2k убедитесь, что вы оберните этот параметр в QUOTENAME или все не так хорошо. –

0

Вы можете заказать с помощью оператора выбора, если вы не хотите, чтобы сделать динамический 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 
Смежные вопросы