我想编写一个SELECT
语句,该语句返回值但不包括文本列表中出现的任何内容
所以我有一个文本列表COL1, COl2, COL4, COL5
(称为myString
)
我想说...
SELECT COLUMN_NAME
FROM INFORMATION_SCHEMA.COLUMNS
WHERE TABLE_NAME = 'INTERFACE' AND COLUMN_NAME NOT IN(myString);
我该怎么做?
我试图在存储过程中解决这个问题,虽然回到基础知识会帮助我理解。我的SP代码看起来像这样......
INSERT INTO @excludeFieldTable VALUES ('CASENO'),('INTLINENO'),('INTMEMBNO'),('INTSTATUS'),('RECTYPE'),('EFFDTE'),('INTERR'),('INTERR2'),
('INTWARN'),('AUTHORISED'),('EXCLUDE'),('UPDATED'),('INTMEMBNO2'),('INTSTATUS2'),('ALTKEY');
INSERT INTO @intColumnList SELECT DISTINCT(COLUMN_NAME) FROM INFORMATION_SCHEMA.COLUMNS WHERE TABLE_NAME='INTERFACE' AND COLUMN_NAME NOT IN (SELECT DISTINCT(excludeFieldName) FROM @excludeFieldTable);
但针对NOT IN
的{{1}}由于某种原因未进行评估(因此@excludeFieldTable
仍然具有值'CASENO','INTLINENO'等)
答案 0 :(得分:1)
您不能将单个逗号分隔的字符串放入IN
子句中。使用EXEC
exec('SELECT COLUMN_NAME
FROM INFORMATION_SCHEMA.COLUMNS
WHERE TABLE_NAME=''INTERFACE''
AND COLUMN_NAME NOT IN (' + @myString + ')')
答案 1 :(得分:1)
Exec('
SELECT COLUMN_NAME
FROM INFORMATION_SCHEMA.COLUMNS
WHERE TABLE_NAME=''INTERFACE''
AND COLUMN_NAME NOT IN(' + @myString + ')')
另一个流行的选择是使用拆分功能然后加入它: 见这里:http://ole.michelsen.dk/blog/split-string-to-table-using-transact-sql/
答案 2 :(得分:1)
没有理由说你的方法不起作用。再次检查您的代码:
MS SQL Server 2008架构设置:
CREATE TABLE INTERFACE
([ID] int,
[COL1] varchar(2),
[COL2] varchar(2),
[COL3] varchar(2),
[COL4] varchar(2),
[CASENO] int,
[INTLINENO] int,
[INTMEMBNO] int,
[INTSTATUS] int,
[RECTYPE] varchar(2),
[EFFDTE] date,
[INTERR] int,
[INTERR2] int,
[INTWARN] int,
[AUTHORISED] varchar(12),
[EXCLUDE] varchar(10),
[UPDATED] varchar(6),
[INTMEMBNO2] int,
[INTSTATUS2] int,
[ALTKEY] varchar(12),
[COL5] varchar(2))
;
查询1 :
DECLARE @excludeFieldTable TABLE
(
excludeFieldName varchar(100)
)
INSERT INTO @excludeFieldTable VALUES
('CASENO'),('INTLINENO'),('INTMEMBNO'),('INTSTATUS'),
('RECTYPE'),('EFFDTE'),('INTERR'),('INTERR2'),
('INTWARN'),('AUTHORISED'),('EXCLUDE'),('UPDATED'),
('INTMEMBNO2'),('INTSTATUS2'),('ALTKEY')
DECLARE @intColumnList TABLE
(
columnList varchar(100)
)
INSERT INTO @intColumnList
SELECT DISTINCT(COLUMN_NAME)
FROM INFORMATION_SCHEMA.COLUMNS
WHERE TABLE_NAME='INTERFACE' AND
COLUMN_NAME NOT IN (SELECT DISTINCT(excludeFieldName) FROM @excludeFieldTable)
SELECT *
FROM @intColumnList
<强> Results 强>:
| COLUMNLIST |
|------------|
| COL1 |
| COL2 |
| COL3 |
| COL4 |
| COL5 |
| ID |
已编辑:
使用字符串,它看起来像这样:
查询2 :
DECLARE @excludeFieldTable VARCHAR(1000)
SET @excludeFieldTable = 'CASENO, INTLINENO, INTMEMBNO, INTSTATUS, RECTYPE, EFFDTE, INTERR, INTERR2, INTWARN, AUTHORISED, EXCLUDE, UPDATED, INTMEMBNO2, INTSTATUS2, ALTKEY'
DECLARE @intColumnList TABLE
(
columnList varchar(100)
)
INSERT INTO @intColumnList
SELECT DISTINCT(COLUMN_NAME)
FROM INFORMATION_SCHEMA.COLUMNS
WHERE TABLE_NAME='INTERFACE' AND
', '+@excludeFieldTable+', ' NOT LIKE '%, '+COLUMN_NAME+', %'
SELECT *
FROM @intColumnList
<强> Results 强>:
| COLUMNLIST |
|------------|
| COL1 |
| COL2 |
| COL3 |
| COL4 |
| COL5 |
| ID |
重新编辑:
SP工作正常:
查询3 :
CREATE PROCEDURE ExcludeField1 AS
DECLARE @excludeFieldTable VARCHAR(1000)
SET @excludeFieldTable = 'CASENO, INTLINENO, INTMEMBNO, INTSTATUS, RECTYPE, EFFDTE, INTERR, INTERR2, INTWARN, AUTHORISED, EXCLUDE, UPDATED, INTMEMBNO2, INTSTATUS2, ALTKEY'
DECLARE @intColumnList TABLE
(
columnList varchar(100)
)
INSERT INTO @intColumnList
SELECT DISTINCT(COLUMN_NAME)
FROM INFORMATION_SCHEMA.COLUMNS
WHERE TABLE_NAME='INTERFACE' AND
', '+@excludeFieldTable+', ' NOT LIKE '%, '+COLUMN_NAME+', %'
SELECT * FROM @intColumnList
<强> Results 强>:
查询4 :
CREATE PROCEDURE ExcludeField2 AS
DECLARE @excludeFieldTable TABLE
(
excludeFieldName varchar(100)
)
INSERT INTO @excludeFieldTable VALUES
('CASENO'),('INTLINENO'),('INTMEMBNO'),('INTSTATUS'),
('RECTYPE'),('EFFDTE'),('INTERR'),('INTERR2'),
('INTWARN'),('AUTHORISED'),('EXCLUDE'),('UPDATED'),
('INTMEMBNO2'),('INTSTATUS2'),('ALTKEY')
DECLARE @intColumnList TABLE
(
columnList varchar(100)
)
INSERT INTO @intColumnList
SELECT DISTINCT(COLUMN_NAME)
FROM INFORMATION_SCHEMA.COLUMNS
WHERE TABLE_NAME='INTERFACE' AND
COLUMN_NAME NOT IN (SELECT DISTINCT(excludeFieldName) FROM @excludeFieldTable)
SELECT * FROM @intColumnList
<强> Results 强>:
查询5 :
EXEC ExcludeField1
<强> Results 强>:
| COLUMNLIST |
|------------|
| COL1 |
| COL2 |
| COL3 |
| COL4 |
| COL5 |
| ID |
查询6 :
EXEC ExcludeField2
<强> Results 强>:
| COLUMNLIST |
|------------|
| COL1 |
| COL2 |
| COL3 |
| COL4 |
| COL5 |
| ID |
如果您想在之前定义排除字符串,它将如下所示:
查询7 :
CREATE PROCEDURE ExcludeField1 @excludeFieldString varchar(1000) AS
DECLARE @intColumnList TABLE
(
columnList varchar(100)
)
INSERT INTO @intColumnList
SELECT DISTINCT(COLUMN_NAME)
FROM INFORMATION_SCHEMA.COLUMNS
WHERE TABLE_NAME='INTERFACE' AND
', '+@excludeFieldString+', ' NOT LIKE '%, '+COLUMN_NAME+', %'
SELECT * FROM @intColumnList
<强> Results 强>:
查询8 :
DECLARE @excludeFieldTable VARCHAR(1000)
SET @excludeFieldTable = 'CASENO, INTLINENO, INTMEMBNO, INTSTATUS, RECTYPE, EFFDTE, INTERR, INTERR2, INTWARN, AUTHORISED, EXCLUDE, UPDATED, INTMEMBNO2, INTSTATUS2, ALTKEY'
EXEC ExcludeField1 @excludeFieldString = @excludeFieldTable
<强> Results 强>:
| COLUMNLIST |
|------------|
| COL1 |
| COL2 |
| COL3 |
| COL4 |
| COL5 |
| ID |
答案 3 :(得分:0)
向所有人道歉(非常感谢您的时间) - 我的SP代码中有一个小错误