Sql server 当筛选表达式中的列可能不存在时,是否使用SQL筛选索引?
我想创建一个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 (
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]'能否提供表架构供我们测试