Почему этот синтаксис T-SQL никогда не был реализован? - PullRequest
1 голос
/ 19 мая 2010

Почему они никогда не позволяли нам делать такие вещи:

Create Proc RunParameterisedSelect

@tableName   varchar(100),
@columnName  varchar(100),
@value       varchar(100)

as

select * from @tableName
where @columnName = @value

Вы можете использовать @value в качестве параметра, очевидно, и вы можете достичь всего этого с помощью динамического SQL, но его создание всегда является проблемой

Так почему же они не сделали его частью языка, вместо того, чтобы заставить вас EXEC(@sql)?

Ответы [ 2 ]

5 голосов
/ 19 мая 2010

Просто потому, что такое невозможно. Это немного похоже на вопрос: «Почему этот синтаксис JavaScript никогда не был реализован»:

var operator  = "<";
var statement = "if"
var op1       = 4

statement (op1 operator 5) op1++;  // whatever

Это никогда не было реализовано, потому что это неосуществимо и, честно говоря, это не имеет никакого смысла. JavaScript имеет eval() для динамического кода:

code = statement+" (op1 "+operator+" 5) op1++;";
eval( code );

И SQL Server имеет EXECUTE для динамического SQL:

/* example only, it is not recommendable to actually *do* this */
Create Proc RunParameterisedSelect
  @tableName   varchar(100),
  @columnName  varchar(100),
  @value       varchar(100)
as
begin 
  declare @code varchar(8000)

  set @code = 'select * from ['+@tableName+'] where ['+@columnName+'] = '+@value

  exec (@code)
end

Суть та же - если это не фиксированная, неизменяемая структура кода (а имя таблицы или столбца код в SQL, а не переменная), вы должны составить строку из это сначала и разбери что. Интерпретатор / компилятор должен создать новое синтаксическое дерево (которое, конечно же, будет исправлено снова).

0 голосов
/ 19 мая 2010

Поскольку процедуры при первом выполнении прекомпилируются в планы запросов, это невозможно. Я согласен, что это не так просто, но только для людей, которые являются наркоманами хранимых процедур - не используйте sp для запросов, создавайте динамические строки запросов и у вас нет проблем.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...