Sql server 当筛选表达式中的列可能不存在时,是否使用SQL筛选索引?

Sql server 当筛选表达式中的列可能不存在时,是否使用SQL筛选索引?,sql-server,tsql,indexing,Sql Server,Tsql,Indexing,我想创建一个SQL命令来创建带有条件的索引。 索引所基于的列以及筛选器表达式中使用的列可能都不存在。 因此,我添加了一个条件,即两个列都存在,但仍会在筛选器表达式中为该列获取一个无效的列名错误。 有办法解决这个问题吗 IF EXISTS (SELECT 1 FROM sys.all_columns WHERE name='Field1' AND object_id=OBJECT_ID('[dbo].[Table1]') ) AND EXISTS (

我想创建一个SQL命令来创建带有条件的索引。 索引所基于的列以及筛选器表达式中使用的列可能都不存在。 因此,我添加了一个条件,即两个列都存在,但仍会在筛选器表达式中为该列获取一个无效的列名错误。 有办法解决这个问题吗

IF EXISTS (SELECT 1 
       FROM sys.all_columns 
       WHERE name='Field1' 
       AND object_id=OBJECT_ID('[dbo].[Table1]') )
AND EXISTS (SELECT 1 
       FROM sys.all_columns 
       WHERE name='Field2' 
       AND object_id=OBJECT_ID('[dbo].[Table1]') )

BEGIN

CREATE NONCLUSTERED INDEX [IX_Table1_Field1] ON [dbo].[Table1]
(
    [Field1]
) 
WHERE ([Field2]=(1))

END
出现问题的表

CREATE TABLE [dbo].[Table1] (
     [Field1] [int] 
)

如果我了解您真正想要什么,我认为您需要像这样使用动态SQL:

declare @tableName nvarchar(max) = N'Table2', @field1 nvarchar(max) = N'Field1', @field2 nvarchar(max) = N'Field2';
declare @sql nvarchar(max) = '';

if exists (select 1 
       from sys.all_columns
       where name = @field1
       and [object_id] = object_id(@tableName))
and exists (select 1 
       from sys.all_columns
       where name = @field2
       and [object_id] = object_id(@tableName))
begin
    set @sql = 'create nonclustered index [IX_'+@tableName+'_'+@field1+'] on [dbo].['+@tableName+'] ( ['+@field1+']) where ['+@field2+']= 1';
end
else if exists (select 1 
       from sys.all_columns
       where name = @field1
       and [object_id] = object_id(@tableName))
begin
    set @sql = 'create nonclustered index [IX_'+@tableName+'_'+@field1+'] on [dbo].['+@tableName+'] ( ['+@field1+'])';
end
else if exists (select 1 
       from sys.all_columns
       where name = @field2
       and [object_id] = object_id(@tableName))
begin
    set @sql = 'create nonclustered index [IX_'+@tableName+'_'+@field2+'] on [dbo].['+@tableName+'] ( ['+@field2+'])';
end

exec sp_sqlexec @sql;
go

你的代码应该是@shA.t我得到一个无效的列名错误。当我离开[Field2]=1的位置时,ik将正常工作。@shA.t在您的示例中,Field2出现在表1中,问题发生在Field2不存在时。那么为什么要检查它是否存在于表1中?=>EXISTS从sys.all_列中选择1,其中name='Field2'和object_id=object_id'[dbo].[Table1]'能否提供表架构供我们测试