【问题标题】:Dynamic parameters for sql query with "IN" operator带有“IN”运算符的 sql 查询的动态参数
【发布时间】:2012-10-24 11:48:33
【问题描述】:

我有一个 ASP.NET 网站 (c#),在代码隐藏中,我想使用 SQL http://www.w3schools.com/sql/sql_in.asp 中的 IN 运算符从我的数据库中获取数据。

语法是:

SELECT column_name(s)
FROM table_name
WHERE column_name IN (value1,value2,...)

我使用存储过程来获取数据,在这个过程中我运行,最后,选择。

我的问题是如何动态构建查询的 (value1, value2, ...) 部分?如何将IN 运算符中出现的值作为SqlParameter(s) 发送?

存储过程是这样定义的:

CREATE PROCEDURE [dbo].[GetAllUsers]
    @ORGANIZATION_ID int = null
AS
BEGIN
    SET NOCOUNT ON;

    begin
       SELECT * 
       from USERS
       where ORGANIZATION_ID = @ORGANIZATION_ID
    end
END

我想将WHERE 子句替换为:

WHERE ORGANIZATION in (xxxxxxxxxxxxx)

如何做到这一点?

谢谢。

【问题讨论】:

  • 您使用的是什么 DBMS (SQLServer/MySQL/Oracle)?

标签: sql-server tsql stored-procedures sqlparameter


【解决方案1】:

可以使用动态sql:

CREATE PROCEDURE [dbo].[GetAllUsers]
    @ORGANIZATION_ID varchar(max) = null
AS
BEGIN
    declare @sql varchar(max)
    @sql = 'SELECT * 
            from USERS
            where ORGANIZATION_ID in ('+@ORGANIZATION_ID+')' 
    SET NOCOUNT ON;
        begin
          exec(@sql)  
        end
END

您必须将 @ORGANIZATION_ID 的类型更改为 varchar 并使用

运行该过程

一个ID:

exec '1' 

或 ID 列表:

exec '1,2,3,4' 

【讨论】:

  • 谢谢。我应该使用 ORGANIZATION_ID varchar(max) 还是 ORGANIZATION_ID varchar(10000)。
  • 但是这样做是不好的做法
  • @Sklivvz 你能告诉我,什么是更好的做法?我会考虑的,然后我会添加新的解决方案。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-10-10
  • 2020-06-06
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多