用于 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代码段