2010-08-29 7 views
0

У меня есть некоторые проблемы с передачей @TableName внутри процедуры Near, которая будет использоваться в одном StoreLocator. Мне нужно попасть в 3 стола. Я тестировал использование QUOTENAME, но проблема всегда здесь. Может кто-то помочь мне решить эту проблему. СпасибоTableName с использованием хранимой процедуры в SQL

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 

@Table или QUOTENAME (@Table) не принимаются. Я тестировал @Table как varchar (50) и тому подобное. Я не SQLexpert.

ответ

1

Вам необходимо 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) 

Кстати, при создании динамического SQL, как это, следить за возможности SQL-инъекции (см http://msdn.microsoft.com/en-us/library/ms161953.aspx). Заявление, которое я написал, не имеет риска для инъекций, потому что оно цитирует единственную строку, в которую он входит.

+0

Спасибо, фиксированный, где открытые/закрытые тормозные механизмы. – user325558

2

SQL Server не позволяет вам выбирать из имени динамической таблицы. Вам нужно будет построить строку nvarchar (max) и либо использовать exec(), либо sp_executesql. Если вы можете, устранить необходимость передавать имя таблицы динамически для ремонтопригодности и производительности причин ...

+0

Мне нужно использовать эту процедуру для поиска близлежащих точек в более чем 10 таблицах, хранящих геосервисы. Не могли бы вы попытаться применить свои предложения в одном более легком образце? храните имена таблиц в некотором списке и используйте оттуда, чтобы выполнить один за другим sp_executesql в главном, но ремонтопригодность невелика. – user325558

1

попробовать

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' 
+0

+1: Но вам нужно указать значения переменных для выражения внутри –

+0

. У меня есть эта процедура. Процедура ожидает параметр «@statement» типа «ntext/nchar/nvarchar», но нет другого более простого способа сделать это только для TableName ? Эта процедура использует внешние функции и не может поставлять значения переменных. – user325558

Смежные вопросы