如何检查 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 中转换文本字符串中的哈希密码

sql server 2008中如何取某字段最大值所在的一条数据(多个字段)

如何解决SQL Server 2008 无法连接到