0

这是我的情况,我有一张PRODUCTS桌子

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”,... 这就是为什么它在执行时什么都不显示的原因。有人要帮忙吗???

4

2 回答 2

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
于 2013-05-19T11:11:57.230 回答
1
create function product_fun
(
    @name varchar(30)
)
returns TABLE
as
return 
(
    select * from products 
    where name like '%' + @name + '%'
)
于 2013-05-19T10:36:58.583 回答