如何检查 SQL Server 2008 中的多个参数?
Posted
技术标签:
【中文标题】如何检查 SQL Server 2008 中的多个参数?【英文标题】:How to check multiple parameters in SQL Server 2008? 【发布时间】:2012-03-31 06:51:54 【问题描述】:如何将多个值传递给 SQL Server 2008 中的存储过程?
我的桌子是这样的:
id Tag platform
1 #class1,#class2 CS
2 #class1 PS
3 #class2 CS
存储过程:
ALTER PROCEDURE [dbo].[usp_Get]-- 1,"'#class1,#class2'"
@Appid INT,
@TagList NVARCHAR (MAX)
AS
BEGIN
-- SET NOCOUNT ON added to prevent extra result sets from
-- interfering with SELECT statements.
SET NOCOUNT ON;
declare @tags varchar(MAX)
set @tags = @TagList
create table #t (tag varchar(MAX))
set @tags = 'insert #t select ' + replace(@tags, ',', ' union select ')
exec(@tags)
Select
id FROM dbo.List WHERE ((appid=@Appid)) AND ((Tags IN(select tag from #t)
END
如果我查询
[dbo].[usp_Get] 1,"'#class1'"
我只得到第二行。但是第一行也有#class1
...
请告诉我........
【问题讨论】:
【参考方案1】:我建议你使用表值参数。
This 问题涉及从 .NET 环境发送值。
CREATE TYPE VarcharContainer as TABLE (
[Value] NVARCHAR(MAX)
)
CREATE PROCEDURE [dbo].[usp_Get] (
@Appid INT,
@TagList VarcharContainer READONLY
) AS
BEGIN
SELECT id FROM dbo.List WHERE appid=@Appid AND Tags IN (select [Value] from @TagList)
END
这意味着该列中只有一个标签。 我强烈建议您避免非规范化和多值字段。
编辑
您可以在MSDN 上找到有关表值参数的更多信息
----------------
| TableName |
----------------
| id |
| -- |
| platform |
----------------
-------------------
| TableNameTag |
-------------------
| TableNameId * |
| ----------- |
| TagId * |
| ----- |
-------------------
----------------
| Tag |
----------------
| TagName |
| TagId |
| ----- |
----------------
这是一个建议的架构。这符合适当关系的基本规则
1.列中的条目是原子的(或单值)
编辑
提醒一下非规范化的坏处,这是我最喜欢的一句话
非规范化几乎总是一个坏主意——除非你真的知道自己在做什么,否则不要这样做。或者你会开始问这样的问题:this、this、this、this、...
source
【讨论】:
@TagList VarcharContainer READONLY 显示无效数据类型错误。 @user1237131 您的问题标题询问如何将多个值传递到 SP。答案是表值类型。就您表中的数据而言,我建议您将其标准化,如 ERD 中所示。这是实现您想要的最直接的方法。您最终会得到另外两个表,但这将为您节省大量的调试时间和精力。当然,如果您有权更改数据库架构。以上是关于如何检查 SQL Server 2008 中的多个参数?的主要内容,如果未能解决你的问题,请参考以下文章
SQL Server 2008 r2:如何检查所有视图的运行时错误?
如何在 SQL Server 2008 中删除区分大小写的检查?
Sql Server 2008如何检查表中是不是存在列? [复制]
如何在 SQL Server 2008 中转换文本字符串中的哈希密码