我有一个动态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在分别传递查询,参数定义和参数值时应该提供的类型检查安全性。
答案 0 :(得分:0)
This page基本上说你不能通过sp_executesql的参数传递表名等。因此最好将它们包装在QUOTENAME()中。在表格[Table_Prefix_ @ sim_id]的表名中,我刚刚使用: QUOTENAME('Table_Prefix'+ CAST(@sim_id as nvarchar(500)))