【问题标题】:How to check multiple parameters in SQL Server 2008?如何检查 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...

请告诉我........

【问题讨论】:

    标签: sql-server-2008


    【解决方案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.列中的条目是原子的(或单值)

    编辑

    提醒一下非规范化的坏处,这是我最喜欢的一句话

    非规范化几乎总是一个坏主意——除非你真的知道自己在做什么,否则不要这样做。或者你会开始问这样的问题:thisthisthisthis、...

    source

    【讨论】:

    • @TagList VarcharContainer READONLY 显示无效数据类型错误。
    • @user1237131 您的问题标题询问如何将多个值传递到 SP。答案是表值类型。就您表中的数据而言,我建议您将其标准化,如 ERD 中所示。这是实现您想要的最直接的方法。您最终会得到另外两个表,但这将为您节省大量的调试时间和精力。当然,如果您有权更改数据库架构。
    猜你喜欢
    • 2014-02-07
    • 2020-06-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多