Модераторы: Akina
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Sp execute как работает с int?? 
V
    Опции темы
Pogreb
Дата 17.7.2007, 20:19 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Awaiting Authorisation
Сообщений: 69
Регистрация: 17.10.2005

Репутация: нет
Всего: нет



Привет.
Перерыл все учебники и не нашел как sp execute парсит строковую переменную, в которой встречается int переменная. Вся проблема в CustomerID - int.  Выдает ошибку и все.

Помогите кто может.

Вот код:
Код


CREATE PROCEDURE spMegaSeach
(
    @Action        AS INT,
    @CustomerID        AS INT,
    @Prefix            AS VARCHAR(50),
    @FName        AS VARCHAR(50),
    @MI            AS VARCHAR(50),
    @LName        AS VARCHAR(50),
    @Nick            AS VARCHAR(50),
    @SSN            AS VARCHAR(50),
    @BirthPlace        AS VARCHAR(50),
    @Citizen        AS VARCHAR(50),
    @LoginName        AS VARCHAR(50),    
    @Type            AS VARCHAR(50),
    @LastReview        AS VARCHAR(50),
    @NextReview        AS VARCHAR(50),
    @Phone        AS VARCHAR(50),
    @Month        AS VARCHAR(50)
)

AS
BEGIN
    --Search
 IF @Action = 6
        BEGIN
        DECLARE @sql AS VARCHAR(1400)
            SET @sql = '
                SELECT *
                 FROM  tbl_customer
                WHERE
                    FNAME like '''+@FNAME+'%'' 

                    AND CustomerID = @CustomerID

                    AND LNAME LIKE '''+ @LNAME+'%''
                    AND NICKNAME LIKE '''+ @Nick+'%''
                    AND Phone LIKE ''%'+ @Phone+'%''
                    AND SSN LIKE ''%' + @SSN +''''

                IF @Month <> ''
                        BEGIN
                            SET @sql = @sql + ' AND LastReview LIKE ''%/'+@Month+'/%'''
                        END 
                    
 
                execute (@sql)
        END

END
GO




PM MAIL   Вверх
boevik
Дата 17.7.2007, 22:46 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Участник Клуба
Сообщений: 1452
Регистрация: 31.5.2004
Где: Израиль

Репутация: 15
Всего: 35



Так будет получше:
Код

CREATE PROCEDURE spMegaSeach
(
    @Action        AS INT,
    @CustomerID        AS INT,
    @Prefix            AS VARCHAR(50),
    @FName        AS VARCHAR(50),
    @MI            AS VARCHAR(50),
    @LName        AS VARCHAR(50),
    @Nick            AS VARCHAR(50),
    @SSN            AS VARCHAR(50),
    @BirthPlace        AS VARCHAR(50),
    @Citizen        AS VARCHAR(50),
    @LoginName        AS VARCHAR(50),    
    @Type            AS VARCHAR(50),
    @LastReview        AS VARCHAR(50),
    @NextReview        AS VARCHAR(50),
    @Phone        AS VARCHAR(50),
    @Month        AS VARCHAR(50)
)

AS
BEGIN
    --Search
 IF @Action = 6
        BEGIN
        DECLARE @sql AS VARCHAR(1400)
            SET @sql = '
                SELECT *
                 FROM  tbl_customer
                WHERE
                    FNAME like '''+@FNAME+'%'' 

                    AND CustomerID = ' + @CustomerID + ' 

                    AND LNAME LIKE '''+ @LNAME+'%''
                    AND NICKNAME LIKE '''+ @Nick+'%''
                    AND Phone LIKE ''%'+ @Phone+'%''
                    AND SSN LIKE ''%' + @SSN +''''

                IF @Month <> ''
                        BEGIN
                            SET @sql = @sql + ' AND LastReview LIKE ''%/'+@Month+'/%'''
                        END 
                    
 
                execute (@sql)
        END

END
GO

нельзя использовать переменую в построеном SQL Statment


--------------------
Никогда не говори никогда
PM MAIL WWW   Вверх
Pogreb
Дата 17.7.2007, 23:57 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Awaiting Authorisation
Сообщений: 69
Регистрация: 17.10.2005

Репутация: нет
Всего: нет



Microsoft OLE DB Provider for ODBC Drivers error '80040e07' 

[Microsoft][ODBC SQL Server Driver][SQL Server]Syntax error converting the varchar value ' SELECT * FROM tbl_customer WHERE FNAME like '%' AND CustomerID = ' to a column of data type int. 

/Manager Data/popCustomerSearch.asp, line 139

Вот что мне выдало на сайте после того как я поменял.
 
Что делать?

line 138:    strSQL = "spMegaSeach 6,'" & CID &"','','" & strFName &"','','" & strLName & "','" & strNickName & "','" & strSocial & "','','','','','','','"& 
                    strPnumber&"','"& strMonth &"'" 

line 139:      SET dbCustomer = Datab.Execute(strSQL)

Это запрос с страницы.  Ругается на него. Могут ли быть проблемы если используешь int?
PM MAIL   Вверх
Pogreb
Дата 18.7.2007, 00:50 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Awaiting Authorisation
Сообщений: 69
Регистрация: 17.10.2005

Репутация: нет
Всего: нет




Я понял в чем проблема. Мой SQL запрос ожидает int, но вместо приходит Varchar.

А как исправить я не занаю. В VB Script вроде бы нет типов данных, только один.

Что делать?
PM MAIL   Вверх
SergKO
Дата 18.7.2007, 08:56 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 231
Регистрация: 14.3.2005

Репутация: 17
Всего: 20



Цитата(Pogreb @  17.7.2007,  23:57 Найти цитируемый пост)
line 138:    strSQL = "spMegaSeach 6,'" & CID &"','','" & strFName &"','','" & strLName & "','" & strNickName & "','" & strSocial & "','','','','','','','"& 
                    strPnumber&"','"& strMonth &"'" 


Вы пытаетесь построить строку, а CID, скорее всего - целое. Как будет производиться конкатенация строки и целого? Если невозможно использовать параметризованный запрос, то используйте строковый CID, но тогда в процедуре @CustomerID опишите как VARCHAR, а потом конвертируйте в целое.
Код

declare @CustomerID    VARCHAR(50);
declare @iCustomerID    int;

    select @CustomerID = '123';
    select @iCustomerID = convert(int, @CustomerID);


В процедуре для запуска лучше использовать sp_executesql. Тогда Вы избегаете ошибок когда в качестве значения параметров передается NULL и приобретаете преимущества, которые дает использование этой системной процедуры. А построение условия запроса лучше усложнить, тогда не будет лишних поисков по параметрам равным '' (пустая строка). Это видно в Вашем примере, когда параметр @FName = ''.

Попробуйте примерно так
Код

CREATE PROCEDURE spMegaSeach
    @Action            INT,
    @CustomerID        INT,
    @Prefix            VARCHAR(50),
    @FName            VARCHAR(50),
    @MI                VARCHAR(50),
    @LName            VARCHAR(50),
    @Nick            VARCHAR(50),
    @SSN            VARCHAR(50),
    @BirthPlace        VARCHAR(50),
    @Citizen        VARCHAR(50),
    @LoginName        VARCHAR(50),    
    @Type            VARCHAR(50),
    @LastReview        VARCHAR(50),
    @NextReview        VARCHAR(50),
    @Phone            VARCHAR(50),
    @Month            VARCHAR(50)
as
begin
    --Search
    if @Action = 6
    begin
    declare    @sql    nvarchar(1400),
            @where    nvarchar(1000);

        set @sql = N'
        SELECT *
        FROM  tbl_customer
        WHERE ';
        
        select @where = N'1=1'; --чтобы не производить дополнительных проверок при построении строки @where. Оптимизатор исключит это сравнение при компиляции запроса.
        
        if @FNAME is not null and @FNAME != ''
            select  @where = @where+N' and FNAME like @FNAME+''%''';
        if @CustomerID is not null
         select  @where = @where+N' AND CustomerID = @CustomerID';
        if @LNAME is not null and @LNAME != ''
            select  @where = @where+N' AND LNAME LIKE @LNAME+''%''';
        if @Nick is not null and @Nick != ''
            select  @where = @where+N' AND NICKNAME LIKE @Nick+''%''';
        if @Phone is not null and @Phone != ''
            select  @where = @where+N' AND Phone LIKE ''%''+@Phone+''%''';
        if @SSN is not null and @SSN != ''
            select  @where = @where+N' AND SSN LIKE ''%''+@SSN';

        if @Month <> ''
        begin
            set @where = @where + N' AND LastReview LIKE ''%''+@Month+''%''';
        end
                
        select @sql = @sql + @where;
        
        execute sp_executesql
         @sql
         , N'@FName VARCHAR(50),@CustomerID INT,@LName VARCHAR(50),@Nick VARCHAR(50),@Phone VARCHAR(50),@SSN VARCHAR(50), @Month VARCHAR(50)'
         , @FName, @CustomerID, @LName, @Nick, @Phone, @SSN, @Month
    end 

end
GO


Если Вы не хотите использовать sp_executesql, то при построении условия все параметры конвертируйте в строку и используйте функцию ISNULL(...).

Это сообщение отредактировал(а) SergKO - 18.7.2007, 08:59
PM MAIL   Вверх
Pogreb
Дата 18.7.2007, 16:53 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Awaiting Authorisation
Сообщений: 69
Регистрация: 17.10.2005

Репутация: нет
Всего: нет





   Спасибо все теперь ясно!!
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "MS SQL"
Akina

Akina

Запрещается!

Публиковать ссылки и обсуждать взлом чего бы то ни было.

  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда
  • Вопросы составления неспецифических запросов рассматриваются здесь
  • Используйте теги [code=sql][/code] для подсветки кода. Используйтe чекбокс "транслит" (возле кнопок кодов) если у Вас нет русских шрифтов.

Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Zloxa, Akina.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | MS SQL Server | Следующая тема »


 




[ Время генерации скрипта: 0.0542 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.