如何从表行执行SQL动态查询字符串?

时间:2014-01-10 16:09:00

标签: sql sql-server-2012

我有一个很棒的查询,用一个为所有外键创建非聚集索引的脚本列表填充我的虚拟表。

然而,这个列表很棒但是,我想进一步采取动态查询来执行每个脚本。

我的动态查询并没有那么多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需要什么语法,是否缺少一些语法?谁能发现这个?

1 个答案:

答案 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)