让我们创建一个存储过程,其中包含许多类似的输入参数:
CREATE PROCEDURE [dbo].[SampleStoredProcedure]
@p1 NVARCHAR(MAX) = NULL,
@p2 NVARCHAR(MAX) = NULL,
@p3 NVARCHAR(MAX) = NULL,
...
@p1000 NVARCHAR(MAX) = NULL
一开始,在程序内部,我想生成一个我应该使用的参数列表(字符串),这取决于一些数据库数据。
例如,我有1000个参数,但我只想读取10个,并使用这些值执行一些SQL语句。
是否可以通过名称将参数作为字符串获取?任何动态SQL查询?
也许有办法迭代所有输入参数并检查列表是否包含当前的参数?
可以分别为每个参数生成具有某些条件的SQL,但存储过程将很长并且以后难以修改。可能性能也会比1.方法更差。表值参数也是一个解决方案,但重点是使用分离的参数来避免它。
要点: 我有一个字符串列表,定义应该映射哪些输入参数,我只是想忽略其他参数,以避免其他条件。 SQL查询应仅使用一些输入参数执行 - 由其他表中的上下文定义。
一些例子:
-- It will generate parameters' list - some context.
DECLARE MyCursor CURSOR
LOCAL STATIC READ_ONLY FORWARD_ONLY
FOR
SELECT [FieldName] FROM [Fields] AS [F] WHERE [F].[ProjectId] = @ProjectId
-- It will execute some action only for defined input parameters.
OPEN MyCursor
FETCH NEXT FROM MyCursor INTO @FieldName
WHILE @@FETCH_STATUS = 0
BEGIN
-- It doesn't work, but it illustrates the problem.
SET @FieldValue = N'@' + @FieldName
EXEC sp_executesql @Query, @Params, @FieldName = @FieldName, @FieldValue = @FieldValue
FETCH NEXT FROM MyCursor INTO @Field
END
CLOSE MyCursor
DEALLOCATE MyCursor
答案 0 :(得分:0)
如果我们假设您的参数(不是TVP)具有已知名称(这可以使用DMV和Dynamic-SQL动态完成),您可以使用一些解决方法,如:
1)创建自己的链接服务器
2)使用OPENQUERY
您:
-- It doesn't work, but it illustrates the problem.
SET @FieldValue = N'@' + @FieldName
将是:
SELECT @FieldValue =
(SELECT * FROM OPENQUERY('loopback_servername','SELECT ' + @FieldName))