【发布时间】:2015-06-13 22:21:23
【问题描述】:
我有两个表tbl_Products 和tbl_Brands,都加入了BrandId。
我有一个存储过程,它应该返回所有属于作为参数传递给它的品牌 ID 的产品。
我的代码如下。
create proc Sp_ReturnPrdoucts
@BrandIds varchar(500) = '6,7,8'
AS
BEGIN
SELECT *
FROM tbl_Products as p
JOIN tbl_Brands b ON p.ProductBrandId = b.BrandId
WHERE b.BrandId IN (@BrandIds)
END
但这会产生错误,因为 BrandId 是 INT 和 @BrandIds 是 VARCHAR
当我按如下方式对其进行硬编码时,它可以正常工作并从 db 中返回所需的数据 ..
create proc Sp_ReturnPrdoucts
@BrandIds varchar(500) = '6,7,8'
AS
BEGIN
SELECT *
FROM tbl_Products AS p
JOIN tbl_Brands b ON p.ProductBrandId = b.BrandId
WHERE b.BrandId IN (6,7,8)
END
任何帮助:)
【问题讨论】:
-
复制:stackoverflow.com/questions/15585632/… 你只需要创建函数来将你的列表转换成表格,然后就可以内联了。
-
@EvaldasBuinauskas 在 sql 中拆分字符串通常不是解决方案,而是一种解决方法。正确的解决方案是尽可能使用正确的数据类型(在本例中为表)。
-
@ZoharPeled 您仍然需要以某种方式将这些值放在那里。
-
旁注:您应该不为您的存储过程使用
sp_前缀。微软有reserved that prefix for its own use (see Naming Stored Procedures),你确实会在未来某个时候冒着名称冲突的风险。 It's also bad for your stored procedure performance。最好只是简单地避免sp_并使用其他东西作为前缀 - 或者根本不使用前缀! -
@EvaldasBuinauskas:你的意思是使用表值参数不能有默认值?
标签: sql sql-server sql-server-2008