lem*_*unk 1 sql sql-server-2012
我有一个很棒的查询,用一个脚本列表填充我的虚拟表,这些脚本为所有外键创建非聚集索引.
但是这个列表很棒,但我想进一步采取动态查询来执行每个脚本.
我没有那么多的动态查询exp,因为大多数时候我只是在我的c#软件中复制功能.
所以我有..
DECLARE @SQLquery as NVARCHAR(MAX)
SET @SQLquery = (SELECT * FROM #ForiegnKeyScriptsNumero)
EXECUTE @SQLquery
DROP TABLE #ForiegnKeyScriptsNumero
Run Code Online (Sandbox Code Playgroud)
现在这不会起作用,因为我会返回多行.
我需要做的是简单地获取每一行并一个接一个地执行.
对于我的生活,我的大脑已经融化了,我只是看不到它.
我知道这是一个简单的修复,我错过了什么?
更新::
只是为了添加我的脚本在我的表的每一行中生成的内容,表只有1列.
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]
Run Code Online (Sandbox Code Playgroud)
这段代码就在我的行中.
作为一种享受,我想我会发布生成脚本的脚本.
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]
Run Code Online (Sandbox Code Playgroud)
好的,我遵循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]
Run Code Online (Sandbox Code Playgroud)
错误是"关键字'IF'附近的语法不正确." 我再次不确定动态sql需要什么语法,是否缺少一些语法?谁能发现这个?
您可以使用此语法从行列表构建字符串.请注意,它不受官方支持,如果您开始使用以下内容,可能会导致问题ORDER BY:
DECLARE @SQLquery as NVARCHAR(MAX) = ''
SELECT @SQLquery += 'EXEC ' + [ScriptColumn] + CHAR(10) + CHAR(13)
FROM #ForiegnKeyScriptsNumero
-- Check it first!
SELECT @SQLQuery
-- EXECUTE (@SQLquery)
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
4887 次 |
| 最近记录: |