0

I have a dedicated Azure SQL environment where I am using a loop to get US States names like 'AB' or 'NY' etc and also geographical boundaries from the same table. Code and error below:

DECLARE db_cursor CURSOR
            FOR SELECT STUSPS, State_Boundaries_geog FROM [dbo].[gis_US_States_GeoJSON]
DECLARE @query VARCHAR(max)
DECLARE @dbname VARCHAR(100)
DECLARE @target_state CHAR(4) 
DECLARE @geom_state geography
DECLARE @distance FLOAT = 482803; -- A distance in metres   482803 = 300 miles
OPEN db_cursor 
    FETCH NEXT FROM db_cursor INTO @target_state, @geom_state;
WHILE @@FETCH_STATUS = 0
BEGIN
    --PRINT @geom_state.STAsText() --prints correctly
    SET @query ='INSERT INTO dbo.gis_shell300_imls(MID)(SELECT m.MID FROM dbo.Museums m , dbo.zcta z WHERE @geom_state.STContains(z.ZCTA_Centroid_Geography)  = 1)'            
   EXECUTE(@query) -- Generates the  'Must declare the scalar variable "@geom_state" error  
   FETCH NEXT FROM db_cursor INTO @target_state, @geom_state
END
CLOSE db_cursor 
DEALLOCATE db_cursor 

The above code generates error about scalar variable @geom_state as shown above. Now, if I change to something like:

SET @query ='INSERT INTO dbo.gis_shell300_imls (MID)(SELECT m.MID FROM dbo.Museums m , dbo.zcta z WHERE'+ @geom_state+'.STContains(z.ZCTA_Centroid_Geography)  = 1)'    

Note: Using the + operator where now the @geom_state variable is recognized, I get this error:

Invalid operator for data type. Operator equals add, type equals geography.

How do I fix it? I have looked into some string concatenations but haven't found a solution yet.

Thanks!

1 Answer 1

0

This is working for me and it is based on modified version of this:

Is there a way to loop through a table variable in TSQL without using a cursor?

As you can see, no more Cursors! HTH someone!

DECLARE @target_state CHAR(4) 
DECLARE @geom_state geography
DECLARE @distance FLOAT = 482803; -- A distance in metres   482803 = 300 miles
declare @RowNum int, @State_ID int
select State_ID=MAX(State_ID) FROM [dbo].[gis_US_States_GeoJSON]     --start with the highest ID
Select @RowNum = Count(*) From [dbo].[gis_US_States_GeoJSON]       --get total number of records
WHILE @RowNum > 0                          --loop until no more records
BEGIN   
    select  @target_state = STUSPS, @geom_state = State_Boundaries_geog
    from [dbo].[US_States] where State_ID= @RowNum 
    INSERT INTO dbo.target_table(MID)(SELECT m.MID 
       FROM dbo.MuseumFile m , dbo.zcta_national z
      WHERE
       @geom_state.STContains(z.ZCTA_Centroid_Geography)  = 1)
    set @RowNum = @RowNum - 1    --decrease count
END
Sign up to request clarification or add additional context in comments.

Comments

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.