Это работает:
DECLARE @SQL NVARCHAR(max)
SET @SQL = N''
SELECT
@SQL = @SQL + 'SELECT id, '''+ Description + ''' as err ' + Criteria +CHAR(13)+CHAR(10)+'UNION ALL'+CHAR(13)+CHAR(10)
FROM settings
SET @SQL = LEFT(@SQL, LEN(@SQL) - 11)
PRINT @SQL
EXEC sp_executesql @SQL
Вероятно, вы должны улучшить его, экранируя символы в строках описания, но это основной ответ на ваш вопрос.
Редактировать: используя OPкомментарий для создания табличной функции и представление, которое ее вызывает.
CREATE FUNCTION dbo.tvf_getErrors
RETURNS TABLE AS
(
SELECT * FROM OPENROWSET('SQLNCLI', 'Server=localhost; Trusted_Connection=yes;', 'EXEC(N''sp_executesql N'''''' + ''SELECT ''''''''select '''''''' + pk + '''''''' as id, '''''''''''''''''''''''' + de + '''''''''''''''''''''''' as err '''''''' + CR + '''''''' UNION ALL'''''''' as sql FROM DVAS'''''' )')
)
RETURN
GO
Я просто не могу проверить, есть ли все '... И выглядит еще страшнее.Теперь все, что вам нужно сделать, это сослаться на эту табличную функцию внутри представления следующим образом:
CREATE VIEW dbo.v_getErrors
AS
SELECT * FROM dbo.tvf_getErrors()
При этом я понял, что вы можете пропустить использование табличной функции и вызвать OpenRowSet непосредственно из представления, как это:
CREATE VIEW dbo.v_getErrors
AS
SELECT * FROM OPENROWSET('SQLNCLI', 'Server=localhost; Trusted_Connection=yes;', 'EXEC(N''sp_executesql N'''''' + ''SELECT ''''''''select '''''''' + pk + '''''''' as id, '''''''''''''''''''''''' + de + '''''''''''''''''''''''' as err '''''''' + CR + '''''''' UNION ALL'''''''' as sql FROM DVAS'''''' )')
Вот оно.Как только вы выясните все апострофы, это сработает.