Передача условия WHERE в хранимую процедуру - PullRequest
2 голосов
/ 21 июня 2009

вот мой Storprocedure

CREATE PROCEDURE [B]

 @BoardID varchar(5000)

AS

declare @sB varchar(8000)
set @sB= ' '


Select name,id,address  from BoardDetail

WHere IsActive=1 and @sB=@BoardID
GO

здесь я отправляю строковый параметр .... Мой @ BoardID содержит строковое условие, например: name = a и id = 5 и address = adfas

Я хочу указать только строку и установить рядом с , и может помочь мне исправить ошибку

Ответы [ 7 ]

8 голосов
/ 21 июня 2009

Вам нужно построить динамический запрос.

См. Эту статью: Проклятие и благословения динамического SQL . Это канонический справочник по динамическому SQL.

Как уже отмечали другие, вы должны использовать динамический SQL экономно и в ситуациях, когда никакой другой метод не подходит. Динамический SQL может открыть риск атак SQL-инъекций, и, как отмечено в «Проклятии и благословениях динамического SQL», есть и более тонкие хитрости, на которые стоит обратить внимание.

6 голосов
/ 21 июня 2009

Это действительно плохая практика. Это ограничит вашу способность проверять параметры SQL, сократить или исключить повторное использование плана запросов и может увеличить дыру в озоновом слое.

Я шучу о последнем, а не о первых двух.

Вам гораздо лучше просто создать три параметра:

CREATE PROCEDURE B
  @name varchar(10),
  @id int,
  @address varchar(20)
AS
BEGIN
  SELECT name, address FROM BoardDetail
  WHERE IsActive = 1 AND BoardID = @id AND name = @name AND address = @address
END

Поверь мне - дорога в ад выложена каскадными строками запроса.

1 голос
/ 23 июня 2009

Если вы хотите, чтобы несколько элементов поиска передавались во время выполнения, вы можете сделать это вместо использования динамического SQl.Помните, что использование динамического SQL обычно является плохой практикой, если его можно избежать.

select * from mytable where (my_ID = @my_id OR @my_id IS NULL) и (client_id = @client_id или @client_id равно нулю)

1 голос
/ 21 июня 2009

Вы можете сделать это с помощью динамического SQL, используя exec или sp_executesql :

CREATE PROCEDURE [B]
    @BoardWhere varchar(5000)
AS
declare @query varchar(8000)
set @query = 'Select name,id,address from BoardDetail where ' + @BoardWhere
exec (@query)

Рекомендуется давать имя схемы при объявлении хранимых процедур, например ::100100

CREATE PROCEDURE dbo.[B]

И, хранимая процедура открыта для внедрения SQL, так что будьте внимательны, кому вы даете права на выполнение. Например, кто-то может передать «1 = 1» в качестве пареметра или еще хуже.

0 голосов
/ 21 июня 2009

Вы пытаетесь проверить несуществующий столбец

Выберите имя, идентификатор, адрес из BoardDetail

WHARE IsActive = 1 и @ sB = @ BoardID

@ sB - это переменная, которая всегда равна NULL и никогда не будет = @ BoardDetail

Если вы пытаетесь выбрать на основе строковых значений, отправленных параметром @BoardDetail = 'name = a и id = 5 и address = adfas', попробуйте это:

ПРОЦЕДУРА СОЗДАНИЯ [B]

@ BoardID varchar (5000)

AS

Объявить @cmd varchar (8000)

SET @cmd = 'Выберите имя, идентификатор, адрес из BoardDetail, где IsActive = 1 и' + @ BoardID

ВЫПОЛНИТЬ (@CMD)

Raj

0 голосов
/ 21 июня 2009

Вы думаете об этом неправильно (ну, не неправильно, но не совсем так, как фреймворк позволяет вам работать с ним).

Вы пытаетесь передать SQL в качестве параметра, а затем добавить его к имеющемуся SQL. Это возможно при использовании динамического SQL , но не без него - и вы его не используете.

То, что вы буквально делаете, сравнивает:

WHere IsActive=1 and @sB=@BoardID
becomes:
WHere IsActive=1 and ' '='name=5 and id=6'

который, конечно, не даст результатов, потому что пустая строка не равна строке, содержащей эти символы.

0 голосов
/ 21 июня 2009

Ну, ты не можешь сделать это таким образом. Ознакомьтесь с этой статьей о нескольких способах динамического предложения, где .

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...