按名称动态获取存储过程参数

时间:2015-08-24 15:09:32

标签: sql sql-server tsql stored-procedures dynamic-sql

让我们创建一个存储过程,其中包含许多类似的输入参数:

CREATE PROCEDURE [dbo].[SampleStoredProcedure]
    @p1 NVARCHAR(MAX) = NULL,
    @p2 NVARCHAR(MAX) = NULL,
    @p3 NVARCHAR(MAX) = NULL,
    ...
    @p1000 NVARCHAR(MAX) = NULL

一开始,在程序内部,我想生成一个我应该使用的参数列表(字符串),这取决于一些数据库数据。

例如,我有1000个参数,但我只想读取10个,并使用这些值执行一些SQL语句。

  1. 是否可以通过名称将参数作为字符串获取?任何动态SQL查询?

  2. 也许有办法迭代所有输入参数并检查列表是否包含当前的参数?

  3. 可以分别为每个参数生成具有某些条件的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
    

1 个答案:

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