Как выполнить процедуру сервера Sql, используя такие параметры, как where @ para1 = @ para2 - PullRequest
3 голосов
/ 21 апреля 2011

У меня есть процедура с одним оператором выбора. Мне нужно создать около 50 процедур, как показано ниже.

create procedure foo1 as 
select cityid, cityname from footballteam 

footballteam будет обычным делом во всех моих процедурах. Вместо того чтобы создавать 50 отдельных процедур, я хочу написать код, как показано ниже, и отправить 3 параметра со своей страницы c #

create procedure foo1 (@id bigint, @name varchar(50), @param bigint)as 
select @id, @name from footballtem where @id =@param

могу ли я так пройти на сервере sql? / Как это сделать

смогу ли я выполнить перегрузку процедуры на сервере sql, иногда мне нужно передать только два параметра, и я хочу получить определенное значение, я передам три или более параметров ....

Ответы [ 6 ]

2 голосов
/ 21 апреля 2011

Для чистого ответа TSQL:

create table footballtem(id int identity(1,1),cityid int, cityname varchar(50))
go
insert footballtem(cityid, cityname) values (123, 'abc')
insert footballtem(cityid, cityname) values (456, 'def')
go
create procedure foo1 (@id sysname, @name sysname, @param bigint) as
declare @sql nvarchar(100) = 'select ' + QUOTENAME(@id) + ','
       + QUOTENAME(@name) + ' from footballtem where '
       + QUOTENAME(@id) + '=@param'
exec sp_ExecuteSql @sql, N'@param bigint', @param
go
exec foo1 'cityid','cityname',123

(кредит должен быть Микаэль Эрикссон re QUOTENAME)

Обратите внимание, что QUOTENAME делает1010 * и @id безопасны для инъекций.

Следует также отметить, что изменяющийся параметр *1014* (@param) безопасен для инъекций - нам не нужно проверять это где-либо;и что это позволит повторно использовать план запроса через sp_ExecuteSql

1 голос
/ 21 апреля 2011

Нет;это сделало бы сравнение значений параметров и вернуло бы значения параметров.Для этого вам нужно будет заменить значения в вызывающей стороне, например:

string idColumn = "id", nameColumn = "name";
string tsql = string.Format(@"
create procedure foo1 (@param bigint)
as select [{0}], [{1}] from footballtem where [{0}]=@param", idColumn,nameColumn);

и иметь 50 SP;вы можете сделать то же самое в TSQL, используя sp_ExecuteSQL для уже замененной строки, но IMO было бы лучше сделать это на уровне приложения, чем внутри базы данных.

Также;вопрос, действительно ли вам нужны хранимые процедуры ... что на самом деле мало поможет;параметризованный запрос TSQL гораздо проще, быстрее и проще в развертывании.

0 голосов
/ 25 сентября 2013

Есть способ сделать перегрузку на MSSQL.Вот как это происходит:

Например, у нас есть процедура sp_Personel, которая принимает тип personel в качестве параметра и перечисляет personel этого типа.

CREATE PROCEDURE [dbo].[sp_Personel]
           @PersonelType int
AS
SELECT Name, JoinDate, PersonelType, Salary
FROM Personel
WHERE PersonelType = @PersonelType
END

Теперь вам нужна другая процедура, которая будет длядаты присоединения персонала.

CREATE PROCEDURE [dbo].[sp_Personel];2
           @JoinDate datetime
AS
SELECT Name, JoinDate, PersonelType, Salary
FROM Personel
WHERE JoinDate <= @JoinDate 
END

Для вызова второй процедуры из студии управления;

[dbo].[sp_Personel];2 N'9/26/2010'
0 голосов
/ 21 апреля 2011

( при условии MS SQL Server )

Сервер MS SQL не поддерживает перегрузку процедур (как в Oracle), но поддерживает параметры ввода и вывода, такие как:

create procedure foo1 (
     @param bigint
    , @id bigint out
    , @name varchar(50) out

   )as 

select 
 @id = fbt.id
,@name = fbt.name 
from 
   footballteam fbt 
where fbt.id =@param

@ id и @name должны быть переданы как выходные параметры нулевого значения правильного типа. После выполнения (cmd.executeNonQuery) вы можете проверить объект команды, чтобы получить новые значения параметров.

Я не уверен, что правильно читаю ваш вопрос, но если да, то это должно получить то, что вы хотите ..

* Добавление лучшего примера кода после вопроса *

//_assumes the following using statements at the top of code file:_
//using System.Data;
//using System.Data.SqlClient;
     public string getTeam(int CityID)
          {
             string name;

             using (var cmd = new SqlCommand("foo1",new SqlConnection("myConnectionStringGoesHere")))
             {
                cmd.Parameters.Add(new SqlParameter("@param", CityID));
                cmd.Parameters.Add(new SqlParameter("@id", SqlDbType.BigInt){Direction=ParameterDirection.Output});
                cmd.Parameters.Add(new SqlParameter("@name", SqlDbType.VarChar,50) { Direction = ParameterDirection.Output });

                cmd.Connection.Open();
                cmd.ExecuteNonQuery();

                name = cmd.Parameters["@name"].Value.ToString();

                cmd.Connection.Close();

             }

             return name;
          }
0 голосов
/ 21 апреля 2011

Я не уверен, правильно ли я вас понимаю, но вы можете указать значение по умолчанию для параметра хранимой процедуры в T-SQL. Так что вы можете опустить его во время разговора.

CREATE PROCEDURE Proc1 @param1 int, @param2 int = -1 AS SELECT case when @param2=-1 then somefield else @param2 end as column from sometable where somekeyfield=@param1; GO
0 голосов
/ 21 апреля 2011

Я думаю, вы просили следующее:

create procedure foo1 (@id bitint out, @name bigint out, @param bigint)
as
select @id=cityid, @name=cityname from footballteam where teamname = @param

Но ваш вопрос создает впечатление, что вы пытаетесь динамически изменять имена столбцов для каждого запроса.

...