0

我有一个动态 SQL 存储过程,它应该替换下面查询中的某些参数。但是,除非参数两边都有空格,否则参数似乎不会被替换。是否有一些转义字符或分隔符可以用来指示参数名称的开始和结束?

@phi_min 和@phi_max 被替换得很好,但不是@server 或@sim_id。

DECLARE @query NVARCHAR(500) = 
  N'SELECT  COUNT(*)
    FROM    [@server].[someDatabaseName].[dbo].[TableName_@sim_id]
    WHERE   @phi_min <= phi AND phi < @phi_max'


DECLARE @paramDefinition NVARCHAR(500) = 
  N'@server         nvarchar(20),
    @sim_id         int,
    @phi_min        real,
    @phi_max        real'

Execute sp_Executesql @query, @paramDefinition,
        @server, 
        @sim_id,
        @phi_min,
        @phi_max,

一个糟糕的解决方案是替换:

FROM    [@server].[databaseName].[dbo].[TableName_@sim_id]

和:

FROM    '+QUOTENAME(@server)+'.[ggDxgg-700].[dbo].[PhiPsi_' + CAST(@sim_id as NVARCHAR(500))+ ']

但这绕过了 sp_executesql 在分别传递查询、参数定义和参数值时应该提供的类型检查安全性。

4

1 回答 1

0

这个页面基本上说你不能通过参数将表名等传递给 sp_executesql。所以最好将它们包装在 QUOTENAME() 中。在 [Table_Prefix_@sim_id] 形式的表名中,我只使用了:QUOTENAME('Table_Prefix' + CAST(@sim_id as nvarchar(500)))

于 2013-09-09T19:15:02.657 回答