2013-05-19 2 views
0

Вот мой случай, у меня есть таблица PRODUCTSUDF Функция поиска файлов в SQL Server

create table PRODUCTS 
(
    ID_PRODUCTS   CHAR(10) primary key not null, 
    NAME     CHAR(30), 
    PRICE     INTEGER 
) 

Тогда я заполнить его с некоторыми данными, ...

insert into PRODUCTS values('B1','Samsung Galaxy Ace 2',250) 
insert into PRODUCTS values('B2','Samsung Galaxy Tab 3',375) 
insert into PRODUCTS values('B3','Samsung Galaxy Note 2',700) 
insert into PRODUCTS values('B4','Apple iPod Touch',200) 
insert into PRODUCTS values('B5','Apple Macbook Pro',1250) 

Тогда я хочу создать хранимую функцию для поиска данных на основе ключевого слова на NAME столбец в таблице PRODUCTS. Например, когда я выполняю эту функцию с ключевым словом Samsung, она должна отображать список, содержащий слово Samsung в названии. Я надеюсь, что этот список будет, как этот внешний вид

ID_PRODUCTS | NAME | PRICE 
======================================== 
B1 | Samsung Galaxy Ace 2 | 250 
B2 | Samsung Galaxy Tab 3 | 375 
B3 | Samsung Galaxy Note 2 | 700 

Вот код, но ничего не показывают, когда выполнить его (select * from dbo.products_fun)

create function product_fun 
(
    @name char(30) 
) 
returns TABLE 
as 
    return 
    (select * from products where name like '%@name%') 

Я думаю, что это ничего не показывают, потому что запрос

select * from products where name like '%@name%' 

Это не поиск ключевых слов внутри переменной @name .., но поиск ключевого слова «@name», ... поэтому он ничего не показывает при его выполнении. Кто-нибудь хочет помочь ???

+1

Я рекомендую вам следует использовать ** 'VARCHAR (30) '**, а не' char (30) ', который будет заполнен до заданной длины 30 символов пробелами ... –

+0

ОК, я сделаю это, .... но как насчет синтаксиса проблемы, мой запрос выбирает * из продуктов, где имя типа «% @ name%», .... ???? Вы знаете, где моя ошибка ??? –

+0

Попытка: 'LIKE @Name + '%'' –

ответ

3

Как я уже говорил - что-то вроде названия продукта, я бы никогда не использовать значение char(x). char(x) следует использовать только для строк фиксированной длины длиной 3-5 символов, например, ISO-коды стран или символы валюты и т. Д. Все остальное должно быть varchar(x).

Этот код прекрасно работает:

CREATE TABLE PRODUCTS1 
(ProductID INT IDENTITY(1,1) PRIMARY KEY CLUSTERED, 
ProductName VARCHAR(30), 
ProductPrice DECIMAL(16,2) 
) 

insert into PRODUCTS1(ProductName, ProductPrice) values('Samsung Galaxy Ace 2',250.0) 
insert into PRODUCTS1(ProductName, ProductPrice) values('Samsung Galaxy Tab 3',375.0) 
insert into PRODUCTS1(ProductName, ProductPrice) values('Samsung Galaxy Note 2',700.0) 
insert into PRODUCTS1(ProductName, ProductPrice) values('Apple iPod Touch',200.0) 
insert into PRODUCTS1(ProductName, ProductPrice) values('Apple Macbook Pro',1250.0) 
GO 

CREATE FUNCTION FindProducts (@name varchar(30)) 
RETURNS TABLE 
AS 
    RETURN (SELECT * FROM dbo.Products1 WHERE Productname LIKE @name + '%') 

Теперь вызова этой функции:

SELECT * FROM dbo.FindProducts('Samsu') 

возвращает этот результат набор:

ProductID ProductName    ProductPrice 
    1  Samsung Galaxy Ace 2  250.00 
    2  Samsung Galaxy Tab 3  375.00 
    3  Samsung Galaxy Note 2  700.00 
+0

спасибо за ваше предложение, .... я очень ценю это –

+1

получил мой upvote. :) –

1
create function product_fun 
(
    @name varchar(30) 
) 
returns TABLE 
as 
return 
(
    select * from products 
    where name like '%' + @name + '%' 
) 
+1

Спасибо, но он все еще ничего не показывает, когда я его выполню выберите * from dbo.products_fun ('Samsung') –

+0

Тип данных 'char (30)' означает, что все, что вы передадите ему, будет дополнено конечные пробелы. –

+0

обновлено: ответили и не возвращались до 12 часов! Сожалею. –

Смежные вопросы