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