在SQL中使用存储过程的表名

在SQL中使用存储过程的表名,sql,sql-server,tsql,stored-procedures,Sql,Sql Server,Tsql,Stored Procedures,我在将@TableName传递到附近的过程中以在一个StoreLocator中使用时遇到一些问题。我需要三张桌子。我已经使用QUOTENAME进行了测试,但问题始终存在。有人能帮我解决这个问题吗。谢谢 ALTER PROCEDURE [dbo].[GetNearbyTable] @Table sysname, @CenterLatitude FLOAT, @CenterLongitude FLOAT, @SearchDistance FLOAT,

我在将@TableName传递到附近的过程中以在一个StoreLocator中使用时遇到一些问题。我需要三张桌子。我已经使用QUOTENAME进行了测试,但问题始终存在。有人能帮我解决这个问题吗。谢谢

ALTER PROCEDURE [dbo].[GetNearbyTable]  
    @Table sysname, 
    @CenterLatitude FLOAT, 
    @CenterLongitude FLOAT, 
    @SearchDistance FLOAT, 
    @EarthRadius FLOAT
AS 

DECLARE @CntXAxis FLOAT
DECLARE @CntYAxis FLOAT
DECLARE @CntZAxis FLOAT 

SET @Table = RTRIM(@Table)   
SET @CntXAxis = COS(RADIANS(@CenterLatitude)) * COS(RADIANS(@CenterLongitude)) 
SET @CntYAxis = COS(RADIANS(@CenterLatitude)) * SIN(RADIANS(@CenterLongitude)) 
SET @CntZAxis = SIN(RADIANS(@CenterLatitude)) 

SELECT TOP 100 *,  
       ProxDistance = @EarthRadius * ACOS( dbo.XAxis(glat, glon)*@CntXAxis + dbo.YAxis(glat, glon)*@CntYAxis + dbo.ZAxis(glat)*@CntZAxis)     
FROM  @Table  
WHERE @EarthRadius * ACOS( dbo.XAxis(glat, glon)*@CntXAxis + dbo.YAxis(glat, glon)*@CntYAxis + dbo.ZAxis(glat)*@CntZAxis) <= @SearchDistance
ALTER过程[dbo].[GetNearbyTable]
@表sysname,
@中心纬度浮动,
@中心经度浮动,
@搜索距离浮动,
@地球半径浮标
作为
声明@CntXAxis FLOAT
声明@CntYAxis FLOAT
声明@CntZAxis浮点
设置@Table=RTRIM(@Table)
设置@CntXAxis=COS(弧度(@centeralation))*COS(弧度(@centeralation))
设置@CntYAxis=COS(弧度(@centeralation))*SIN(弧度(@centeralation))
设置@CntZAxis=SIN(弧度(@centeralation))
选择前100名*,
ProxDistance=@EarthRadius*ACOS(dbo.XAxis(glat,glon)*@CntXAxis+dbo.YAxis(glat,glon)*@CntYAxis+dbo.ZAxis(glat)*@CntZAxis)
来自@Table

其中@EarthRadius*ACOS(dbo.XAxis(glat,glon)*@CntXAxis+dbo.YAxis(glat,glon)*@CntYAxis+dbo.ZAxis(glat)*@CntZAxis)SQL Server不允许您从动态表名中进行选择。您需要构建一个nvarchar(max)字符串,并使用
exec()
sp\u executesql
。如果可以,出于可维护性和性能原因,无需动态传入表名…

SQL Server不允许您从动态表名中进行选择。您需要构建一个nvarchar(max)字符串,并使用
exec()
sp\u executesql
。如果可以的话,出于可维护性和性能原因,不需要动态传入表名…

试试看

exec sp_executesql N'SELECT TOP 100 *, ProxDistance = @EarthRadius * ACOS( dbo.XAxis(glat, glon)*@CntXAxis + dbo.YAxis(glat, glon)*@CntYAxis + dbo.ZAxis(glat)*@CntZAxis)
FROM  @Table'  
试一试

您需要
EXEC()
来执行动态SQL。这应该是您期望的查询:

EXEC('
SELECT TOP 100 *,  
       ProxDistance = ' + @EarthRadius  + ' * ACOS( dbo.XAxis(glat, glon)*'
       + @CntXAxis + ' + dbo.YAxis(glat, glon)*'
       + @CntYAxis + ' + dbo.ZAxis(glat)*'
       + @CntZAxis + ')     
FROM  ' + QUOTENAME(@Table) + '
WHERE ' + @EarthRadius + ' * ACOS( dbo.XAxis(glat, glon)*'
       + @CntXAxis + ' + dbo.YAxis(glat, glon)*'
       + @CntYAxis + ' + dbo.ZAxis(glat)*'
       + @CntZAxis + ') <= ' + @SearchDistance)
EXEC('
选择前100名*,
ProxDistance='+@EarthRadius+'*ACOS(dbo.XAxis(glat,glon)*'
+@CntXAxis+'+dbo.YAxis(glat,glon)*'
+@CntYAxis+'+dbo.ZAxis(glat)*'
+@CntZAxis+”)
来自“+QUOTENAME”(@Table)+”
其中'+@EarthRadius+'*ACOS(dbo.XAxis(glat,glon)*'
+@CntXAxis+'+dbo.YAxis(glat,glon)*'
+@CntYAxis+'+dbo.ZAxis(glat)*'
+@CntZAxis+)您需要
EXEC()
来执行动态SQL。这应该是您期望的查询:

EXEC('
SELECT TOP 100 *,  
       ProxDistance = ' + @EarthRadius  + ' * ACOS( dbo.XAxis(glat, glon)*'
       + @CntXAxis + ' + dbo.YAxis(glat, glon)*'
       + @CntYAxis + ' + dbo.ZAxis(glat)*'
       + @CntZAxis + ')     
FROM  ' + QUOTENAME(@Table) + '
WHERE ' + @EarthRadius + ' * ACOS( dbo.XAxis(glat, glon)*'
       + @CntXAxis + ' + dbo.YAxis(glat, glon)*'
       + @CntYAxis + ' + dbo.ZAxis(glat)*'
       + @CntZAxis + ') <= ' + @SearchDistance)
EXEC('
选择前100名*,
ProxDistance='+@EarthRadius+'*ACOS(dbo.XAxis(glat,glon)*'
+@CntXAxis+'+dbo.YAxis(glat,glon)*'
+@CntYAxis+'+dbo.ZAxis(glat)*'
+@CntZAxis+”)
来自“+QUOTENAME”(@Table)+”
其中'+@EarthRadius+'*ACOS(dbo.XAxis(glat,glon)*'
+@CntXAxis+'+dbo.YAxis(glat,glon)*'
+@CntYAxis+'+dbo.ZAxis(glat)*'

+@CntZAxis+”)+1:但您需要为InlineOK语句提供变量值我有一个'Procedure expects parameter'@statement',类型为'ntext/nchar/nvarchar',但没有其他更简单的方法仅为TableName提供变量值?此过程使用外部函数,无法提供变量值。+1:但您需要提供变量值s到语句insideOk我有一个“过程需要参数”@statement”,类型为“ntext/nchar/nvarchar”,但没有其他更简单的方法使其仅用于表名?此过程使用外部函数,无法提供变量值。我需要使用此过程搜索存储GeoService的10多个表中的附近点ces。你能试着在一个更简单的示例中应用你的建议吗?将表名存储在一些列表中,然后从那里开始一个接一个地执行sp_executesql,但可维护性不是很好。我需要使用此过程搜索存储geoservices的10多个表中的附近点。你能试着在其中应用你的建议吗更简单的示例?将表名存储在一些列表中,然后从那里开始逐个执行主sp_executesql,但可维护性不好。谢谢,修复了打开/关闭制动器的位置。谢谢,修复了打开/关闭制动器的位置。