-
Notifications
You must be signed in to change notification settings - Fork 2
Description
With the current design of the library, SET statements have a rather weird behavior. In short, before every top-level statement all local variables are redeclared with their initial value. This is a behavior hidden from the user and is potentially dangerous.
Examples
To illustrate the current behavior, here are some examples:
-
Top-level SET
DECLARE @A INT = 10 SET @A = 5 PRINT @AWill print 10. The SET is actually executed but has no effect since the variable is lost after batch execution and then redeclared with its initial value before the PRINT.
-
SET in control flow
DECLARE @A INT = 10 IF 1 = 1 BEGIN SET @A = 5 PRINT @A ENDWill print 5 since the whole IF is executed as a single statement.
-
And a mixed example that shows the inconsistent behavior
DECLARE @A INT = 10 IF 1 = 1 BEGIN SET @A = 5 PRINT @A END PRINT @AWill produce 5 followed by a 10, combining the behavior of the previous two examples.
Solution
It's unfortunately not easy to fix this in general, but it would be nice to at least add a warning log whenever SET statements are parsed in a script.
Note that simply banning SET statements at top level is not sufficient, because of cases like the third example - hence it is not trivial to statically determine which scripts would work as expected.