我有一个很棒的查询,用一个为所有外键创建非聚集索引的脚本列表填充我的虚拟表。
然而,这个列表很棒但是,我想进一步采取动态查询来执行每个脚本。
我的动态查询并没有那么多exp,因为大多数时候我只是在我的c#软件中复制功能。
所以我有..
DECLARE @SQLquery as NVARCHAR(MAX)
SET @SQLquery = (SELECT * FROM #ForiegnKeyScriptsNumero)
EXECUTE @SQLquery
DROP TABLE #ForiegnKeyScriptsNumero
现在这不会起作用,因为我会返回多行。
我需要做的是简单地获取每一行并逐个执行。
对于我的生活,我的大脑已经融化了,我只是看不到它。
我知道这是一个简单的修复,我错过了什么?
更新::
只是在这里添加我的脚本在表格的每一行中生成的内容,表格只有一列。
IF NOT EXISTS
(SELECT * FROM sys.indexes WHERE object_id = OBJECT_ID(N'[dbo].[ActivityLog]')
AND name = N'IX_ActivityLogTypeId') CREATE NONCLUSTERED INDEX [IX_ActivityLogTypeId] ON [dbo].[ActivityLog]( [ActivityLogTypeId] ASC )
WITH (PAD_INDEX = OFF,
STATISTICS_NORECOMPUTE = OFF,
SORT_IN_TEMPDB = OFF,
IGNORE_DUP_KEY = OFF,
DROP_EXISTING = OFF,
ONLINE = OFF,
ALLOW_ROW_LOCKS = ON,
ALLOW_PAGE_LOCKS = ON) ON [PRIMARY]
这段代码就在我的行中。
作为一种享受,我想我会发布生成脚本的脚本。
CREATE TABLE #ForiegnKeyScriptsRun (scripts nvarchar(max))
INSERT INTO #ForiegnKeyScriptsRun
SELECT
'IF NOT EXISTS (SELECT * FROM sys.indexes WHERE object_id = OBJECT_ID(N''[dbo].['
+ tab.[name]
+ ']'') AND name = N''IX_'
+ cols.[name]
+ ''') '
+ 'CREATE NONCLUSTERED INDEX [IX_'
+ cols.[name]
+ '] ON [dbo].['
+ tab.[name]
+ ']( ['
+ cols.[name]
+ '] ASC ) WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, SORT_IN_TEMPDB = OFF, IGNORE_DUP_KEY = OFF, DROP_EXISTING = OFF, ONLINE = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY]'
FROM
sys.foreign_keys keys
INNER JOIN
sys.foreign_key_columns keyCols
ON keys.object_id = keyCols.constraint_object_id
INNER JOIN
sys.columns cols
ON keyCols.parent_object_id = cols.object_id
AND
keyCols.parent_column_id = cols.column_id
INNER JOIN
sys.tables tab
ON keyCols.parent_object_id = tab.object_id
ORDER BY tab.[name], cols.[name]
好的,我遵循JKN解决方案,但检查时生成的代码不喜欢IF
EXEC IF NOT EXISTS (SELECT * FROM sys.indexes WHERE object_id = OBJECT_ID(N'[dbo].[ActivityLog]') AND name = N'IX_ActivityLogTypeId') CREATE NONCLUSTERED INDEX [IX_ActivityLogTypeId] ON [dbo].[ActivityLog]( [ActivityLogTypeId] ASC ) WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, SORT_IN_TEMPDB = OFF, IGNORE_DUP_KEY = OFF, DROP_EXISTING = OFF, ONLINE = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY]
错误是“关键字'IF'附近的语法不正确。”我再次不确定动态sql需要什么语法,是否缺少一些语法?谁能发现这个?
答案 0 :(得分:8)
您可以使用此语法从行列表构建字符串。请注意,它不受官方支持,如果您开始使用ORDER BY
:
DECLARE @SQLquery as NVARCHAR(MAX) = ''
SELECT @SQLquery += 'EXEC ' + [ScriptColumn] + CHAR(10) + CHAR(13)
FROM #ForiegnKeyScriptsNumero
-- Check it first!
SELECT @SQLQuery
-- EXECUTE (@SQLquery)