Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/303.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/71.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# SQL Server查询:获取其他表字段中不存在的列的列表_C#_Sql_Sql Server - Fatal编程技术网

C# SQL Server查询:获取其他表字段中不存在的列的列表

C# SQL Server查询:获取其他表字段中不存在的列的列表,c#,sql,sql-server,C#,Sql,Sql Server,我只需要从SPLANNING_ROOMDATA2表中选择所有列名,这样这些列名就不应该存在于另一个表中以逗号分隔的列名列表中。这是我在C ASP.NET应用程序中的查询。我的查询生成一个错误,如“Where附近的语法错误” 注意,如果我删除了第二个Where子句,那么我会得到一个列列表,但这不是我想要的。我做了一些搜索,但没有一个符合我的需要 ***编辑:到目前为止,没有一个答案有效。我将尝试更改splanning_restricted_attributes表,以允许每行有一个受限属性,而不是逗

我只需要从SPLANNING_ROOMDATA2表中选择所有列名,这样这些列名就不应该存在于另一个表中以逗号分隔的列名列表中。这是我在C ASP.NET应用程序中的查询。我的查询生成一个错误,如“Where附近的语法错误”

注意,如果我删除了第二个Where子句,那么我会得到一个列列表,但这不是我想要的。我做了一些搜索,但没有一个符合我的需要


***编辑:到目前为止,没有一个答案有效。我将尝试更改splanning_restricted_attributes表,以允许每行有一个受限属性,而不是逗号分隔的属性。谢谢大家**

使用AND而不是WHERE两次

SqlCommand cmd = new SqlCommand("SELECT COLUMN_NAME 
FROM INFORMATION_SCHEMA.COLUMNS 
WHERE TABLE_NAME='Splanning_RoomData2' 
AND COLUMN_NAME NOT IN (SELECT ATTRIBUTENAME 
                        FROM SPLANNING_RESTRICTED_ATTRIBUTES)", con);

使用和代替WHERE两次

SqlCommand cmd = new SqlCommand("SELECT COLUMN_NAME 
FROM INFORMATION_SCHEMA.COLUMNS 
WHERE TABLE_NAME='Splanning_RoomData2' 
AND COLUMN_NAME NOT IN (SELECT ATTRIBUTENAME 
                        FROM SPLANNING_RESTRICTED_ATTRIBUTES)", con);

不应将列表存储为逗号分隔的值。它们应该位于一个单独的表中,称为连接表,每列和表各有一行

但有时,你会被这样的结构所困扰。以下是一种获取所需信息的方法:

select c.COLUMN_NAME
from INFORMATION_SCHEMA.COLUMNS c LEFT JOIN
     SPLANNING_RESTRICTED_ATTRIBUTES ra
     ON ',' + lower(ra.ATTRIBUTENAME) + ',' LIKE '%,' + lower(c.column_name) + ',%'
where TABLE_NAME = 'Splanning_RoomData2' and ra.ATTRIBUTENAME is null;

不应将列表存储为逗号分隔的值。它们应该位于一个单独的表中,称为连接表,每列和表各有一行

但有时,你会被这样的结构所困扰。以下是一种获取所需信息的方法:

select c.COLUMN_NAME
from INFORMATION_SCHEMA.COLUMNS c LEFT JOIN
     SPLANNING_RESTRICTED_ATTRIBUTES ra
     ON ',' + lower(ra.ATTRIBUTENAME) + ',' LIKE '%,' + lower(c.column_name) + ',%'
where TABLE_NAME = 'Splanning_RoomData2' and ra.ATTRIBUTENAME is null;

我刚刚发布了@Gordon Linoff answer的更新答案,请尝试以下查询:

select c.COLUMN_NAME
from INFORMATION_SCHEMA.COLUMNS c JOIN
     SPLANNING_RESTRICTED_ATTRIBUTES ra
     ON ',' + lower(ra.ATTRIBUTENAME) + ',' NOT LIKE '%,' + lower(c.column_name) + ',%'
where c.TABLE_NAME = 'Splanning_RoomData2';

我刚刚发布了@Gordon Linoff answer的更新答案,请尝试以下查询:

select c.COLUMN_NAME
from INFORMATION_SCHEMA.COLUMNS c JOIN
     SPLANNING_RESTRICTED_ATTRIBUTES ra
     ON ',' + lower(ra.ATTRIBUTENAME) + ',' NOT LIKE '%,' + lower(c.column_name) + ',%'
where c.TABLE_NAME = 'Splanning_RoomData2';


您已将where关键字放置了2次。请尝试将where表\u NAME='Splanning\u RoomData2'和列\u NAME不在Splanning\u RESTRICTED\u attributes中选择ATTRIBUTENAME,让我尝试删除它。谢谢,我想你的会有用的;请回答。谢谢!如果your table行是逗号分隔的,那么您需要查看@Gordon Linoff answer,因为直接IN无法对其进行操作。我认为这两个答案中的任何一个都不起作用。我可以使用xml,如果有帮助的话,请不要在attributename表中使用逗号分隔的列名列表,但这些列名将是硬编码值,csv将更易于阅读。您已将where关键字放置了2次。请尝试将where table\u NAME='Splanning\u RoomData2'和列\u NAME NOT置于从Splanning中选择attributename\u RESTRICTED\u Attributes中,让我尝试删除那个谢谢,我想你的会有用的;请回答。谢谢!如果your table行是逗号分隔的,那么您需要查看@Gordon Linoff answer,因为直接IN无法对其进行操作。我认为这两个答案中的任何一个都不起作用。如果有帮助的话,我可以使用xml,而不是attributename表中以逗号分隔的列名列表,但这些列名将是硬编码的值,csv将更易于读取。对于以逗号分隔的值存储在单个列中的列表,IN不起作用。我正在检查这一点,以查看是否确实根据需要返回了所有数据。谢谢。attributename是CSV吗?@Matt的答案起作用了,因为我更改了SPLANNING_RESTRICTED_ATTRIBUTES表以删除每行的CSV值,而将它们作为每行一个值。这使得数据集稍长一些,但也不太糟糕。其他答案都不起作用。感谢all.IN对于以逗号分隔的值存储在单个列中的列表不起作用。我正在检查它,以查看是否确实根据需要返回了所有数据。谢谢。attributename是CSV吗?@Matt的答案起作用了,因为我更改了SPLANNING_RESTRICTED_ATTRIBUTES表以删除每行的CSV值,而将它们作为每行一个值。这使得数据集稍长一些,但也不太糟糕。其他答案都不起作用。谢谢大家。是的,第一人称的答案仍然返回值;我要试试你的解决方案。谢谢。我收到一个错误:使用您的答案的列名“TABLE_name”不明确。我认为这个答案行不通。请参阅我上面的评论。@Meengla只需使用一个具有列名的适当表即可。如果我没有弄错,那么将WHERE子句更改为WHERE c.TABLE_NAME='Splanning_RoomData2';当我使用c.TABLE_NAME时,错误消失了,但结果仍然不是预期的:我仍然从Splanning_Restricted_Attributes表的Attributename字段获取列的名称。是的,第一人称的答案仍然返回值;我要试试你的解决方案。谢谢。我收到一个错误:使用您的答案的列名“TABLE_name”不明确。我认为这个答案行不通。请参阅我上面的评论。@Meengla只需使用一个具有列名的适当表即可。如果我没有弄错,那么将WHERE子句更改为WHERE c.TABLE_NAME='Splanning_RoomData2';当我使用c.TABLE_NAME时,错误消失了,但结果仍然不是预期的:我仍然从Splanning_Restricted_Attributes表的Attributename字段获取列的名称。正在尝试…但您可能需要使用c.TABLE_NAME?好的,我使用c.TABLE_NAME尝试了您的代码,现在它为每个列名和al返回多个条目
因此仍然返回不需要的值。顺便说一句,在这种情况下,我们不能使用相等运算符,而不是使用'LIKE'运算符吗?CSV中的列名和值在此处转换为小写。正如您从编辑的问题中看到的:我正在更改表结构。谢谢你的帮助!尝试…但您可能需要使用c.TABLE_名称?好的,我尝试了使用c.TABLE_名称的代码,现在它为每个列名返回多个条目,并且仍然返回不需要的值。顺便说一句,在这种情况下,我们不能使用相等的运算符,而不是使用“LIKE”运算符吗?CSV中的列名和值在此处转换为小写。正如您从编辑的问题中看到的:我正在更改表结构。谢谢你的帮助!