动态SQL替换需要空白

时间:2013-09-07 03:29:56

标签: tsql dynamic-sql

我有一个动态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在分别传递查询,参数定义和参数值时应该提供的类型检查安全性。

1 个答案:

答案 0 :(得分:0)

This page基本上说你不能通过sp_executesql的参数传递表名等。因此最好将它们包装在QUOTENAME()中。在表格[Table_Prefix_ @ sim_id]的表名中,我刚刚使用:     QUOTENAME('Table_Prefix'+ CAST(@sim_id as nvarchar(500)))