用于 Visual Studio 的 TableAdapter 查询生成器的 NOT IN 语句

Posted

技术标签:

【中文标题】用于 Visual Studio 的 TableAdapter 查询生成器的 NOT IN 语句【英文标题】:NOT IN statement for Visual Studio's Query Builder for TableAdapter 【发布时间】:2010-05-20 12:05:29 【问题描述】:

我想在查询生成器中使用 Visual Studio 2008 构建一个类似如下的 TableAdapter (MSSQL 2008) 的查询:

select * from [MyDB].[dbo].[MyView] where UNIQUE_ID NOT IN ('MyUniqueID1','MyUniqueID2')

如何在查询中设置过滤器才能使用myTableAdapter.GetDataExceptUniqueIds(...) 函数调用它?

我尝试将过滤器设置为NOT IN (@ids) 并调用它

string[] uniqueIds = ...;
myTableAdapter.GetDataExceptUniqueIds(String.Join("','", uniqueIds));

StringBuilder sb = new StringBuilder("'");
sb.Append(String.Join("','", uniqueIds));
sb.Append("'");
return myTableAdapter.GetDataExceptUniqueIds(sb.ToString());

但都失败了

【问题讨论】:

【参考方案1】:

您不能在 SELECT ... WHERE [NOT] IN 列表中使用动态参数

解决方法:

创建表函数,类似如下函数:

CREATE FUNCTION dbo.ParmsToTable(@Parameters varchar(4000))
returns @result TABLE (Value varchar(100))
AS  
begin
     DECLARE @pTable table
          (
          Value varchar(100)
          )

     DECLARE @Value varchar(100), @Pos int

     SET @Parameters = LTRIM(RTRIM(@Parameters))+ ','
     SET @Pos = CHARINDEX(',', @Parameters, 1)

     IF REPLACE(@Parameters, ',', '') <> ''
     BEGIN
          WHILE @Pos > 0
          BEGIN
               SET @Value = LTRIM(RTRIM(LEFT(@Parameters, @Pos - 1)))
               IF @Value <> ''
               BEGIN
                    INSERT INTO @pTable (Value) VALUES (@Value) 
               END
               SET @Parameters = RIGHT(@Parameters, LEN(@Parameters) - @Pos)
               SET @Pos = CHARINDEX(',', @Parameters, 1)

          END
     END    
     INSERT @result
     SELECT value
        FROM @pTable 
     RETURN
END    

并按如下方式更改您的 TableAdapter:

select * from [MyDB].[dbo].[MyView] where UNIQUE_ID NOT IN
(select value from dbo.ParmsToTable(@p)  )

【讨论】:

以上是关于用于 Visual Studio 的 TableAdapter 查询生成器的 NOT IN 语句的主要内容,如果未能解决你的问题,请参考以下文章

我需要用于 .NET 4.5 的 Visual Studio 2012 还是 Visual Studio 2010 适合 4.5?

json 用于Visual Studio代码的AsciiDoc代码段

MFC 是不是仅适用于 Visual Studio,不适用于 Visual C++ Express?

用于 C++ 的 Visual Studio 代码指标插件

Visual Studio 2017 不同帐户用于不同部署

Visual Studio 2008 intellisense用于枚举类型