v2.5.2
Giriş yap

Dinamik index oluşturmada hata alıyorum

busrademirtas
310 defa görüntülendi

Bir tabloda oluşturmak istediğim index adı, tablo adı ve kolun adını tutuyorum.
Bu tablodan alanları okuyarak döngü halinde create index kodunu yazıyorum fakat
"Could not find stored procedure" hatası alıyorum. Yardımcı olabilir misiniz?

Kodum :

DECLARE @count INT = 0;
DECLARE @Index_Name NVARCHAR(50) = '';
DECLARE @Table_Name NVARCHAR(50) = '';
DECLARE @Column_Name NVARCHAR(50) = '';
DECLARE @sql NVARCHAR(MAX) = '';
DECLARE @temptable NVARCHAR(10) = 'tblIndexOl';

IF (EXISTS (SELECT * FROM INFORMATION_SCHEMA.TABLES WHERE TABLE_SCHEMA = 'dbo' AND TABLE_NAME = ''+@temptable+''))
   BEGIN
		SET @sql = N'TRUNCATE TABLE '+@temptable+';';
		EXEC(@sql);
		--PRINT 'TABLO İÇİNDEKİ VERİLER SİLİNDİ';
   END;
ELSE
   BEGIN
		SET @sql = N'CREATE TABLE [dbo].[tblIndexOl](
				[id] [int] IDENTITY(1,1) NOT NULL,
				[indexName] [nvarchar](150) NOT NULL DEFAULT '''',
				[tableName] [nvarchar](150) NOT NULL DEFAULT '''',
				[columnName] [nvarchar](150) NOT NULL  DEFAULT ''''
			);';
		EXEC(@sql);
		--PRINT 'TABLO OLUŞTU';
   END;

SET @sql = N'INSERT INTO [dbo].[tblIndexOl] SELECT a.name AS Index_Name, OBJECT_NAME(a.object_id) AS Table_Name, COL_NAME(b.object_id,b.column_id) AS Column_Name FROM sys.indexes AS a INNER JOIN sys.index_columns AS b ON a.object_id = b.object_id AND a.index_id = b.index_id WHERE name is not null and name like ''IX%'';';
EXEC(@sql);

--INSERT INTO [dbo].[tblIndexOl] VALUES ('', '', '')
SET @count = (SELECT count(*) FROM [dbo].[tblIndexOl]);
WHILE @count > 0
	BEGIN
		SET @Index_Name = (SELECT [indexName] FROM [kontrol].[dbo].[tblIndexOl] WHERE id = @count);
		SET @Table_Name = (SELECT [tableName] FROM [kontrol].[dbo].[tblIndexOl] WHERE id = @count);
		SET @Column_Name = (SELECT [columnName] FROM [kontrol].[dbo].[tblIndexOl] WHERE id = @count);
		--SET @sql = N'DROP INDEX '+@Index_Name+' ON '+@Table_Name+''; EXEC @sql;
		
		IF EXISTS ((SELECT 1 FROM sys.indexes WHERE Name=''+@Index_Name+''))
			BEGIN
				PRINT 'Index Mevcut: '+@Index_Name;
			END
		ELSE
			BEGIN
				SET @sql = N'CREATE INDEX '+ @Index_Name + ' ON ' + @Table_Name + '('+@Column_Name+');';
				EXEC @sql;				
				--PRINT 'Index Mevcut Değil: '+@Index_Name;
			END
		SET @count = @count - 1;
	END;

busrademirtas
727 gün önce

Sorumun cevabını buldum sizlere de yardımcı olması açısından ekliyorum.
'sp_executesql' kullanmak çözüm getirdi.