Вопрос по – T-SQL: невозможно передать каскадную строку в качестве аргумента хранимой процедуре

20

Scenario: Need to pass n аргументы хранимой процедуры. Один из аргументов имеет типvarchar(x), Этот аргумент varchar должен быть построен из нескольких других переменных varchar. Эта проблема использует SQL Server 2005, но это относится ко всем версиям SQL Server.

Setup:

DECLARE @MyString varchar(500), @MyBar varchar(10), @MyFoo varchar(10)

SELECT @MyBar= 'baz ' 
SELECT @MyFoo= 'bat ' 

-- try calling this stored procedure!
EXEC DoSomeWork @MsgID, 'Hello ' + @MyBar + '" world! "' + @MyFoo + '".'

Это создает исключение в SQL Server:Incorrect syntax near '+', Как правило, вы можете подумать, что тип данных будет неправильным (т.е. переменные имеют разные типы, но это приведет к другому сообщению об ошибке).

Вот правильная реализация, которая компилируется без ошибок:

SELECT @MyString= 'Hello ' + @MyBar + '" world! "' + @MyFoo + '".';

EXEC DoSomeWork @ID, @MyString

Question: Why Неужели T-SQL не может обрабатывать конкатенацию varchar в качестве аргумента? Он знает типы, так как они были правильно объявлены как varchar.

Ваш Ответ

3   ответа
21

чем другие операторы, такие как SELECT и SET. Например, соблюдайте раздел синтаксиса в верхней части следующих двух страниц.

ВЫПОЛНИТЬ утверждение:http://msdn.microsoft.com/en-us/library/ms188332.aspx

SET оператор:http://msdn.microsoft.com/en-us/library/ms189484.aspx

Синтаксис для EXECUTE принимает толькоvalue

[[@parameter =] {value | @variable [OUTPUT] | [DEFAULT]]

Принимая во внимание, что синтаксис для SET принимаетexpression

{@local_variable = expression}

Значение в основном является жестко закодированной константой, но выражение будет оцениваться. Это похоже на то, что varchar SELECT 1 + 1 '. Это просто значение varchar прямо сейчас. Тем не менее, вы можетеevaluate строка такая:

EXEC('SELECT 1 + 1')

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

Выражение T-SQL:http://msdn.microsoft.com/en-us/library/ms190286.aspx

Сайт, указанный в этом комментарии, больше не работает.
Может бытьEXEC только разрешает строкуvariables потому что хранимые процедуры могут иметьOUT параметры, для которых выражения не имеют смысла. Но те не работают со строкойliterals или...
Благодарю. Я обновил ссылки для использования MSDN.
2

Проклятие и благословения динамического SQL для дополнительной информации.

динамический SQL плохой зверь.
2

Вы не можете сделать что-то подобное

exec SomeProc getdate()

Вы должны поместить все эти вещи в параметр, как вы делаете в нижнем запросе Это может быть потому, что он не является детерминированным (по крайней мере, для функций)

Похожие вопросы