2016-08-24 3 views
1

Как создать переменные, которые заданы один раз, а затем использоваться в запросах позже в скрипте? Эти переменные могут использоваться несколько раз в запросе и в нескольких запросах в скрипте. Я использую @x как такую ​​переменную в приведенных ниже примерах.SQL добавить переменную в запрос

То, что я хочу сделать что-то вроде:

Declare @Query nvarchar(1000) 
Declare @x nvarchar(40) 

Set @x = 'test' 
Set @Query = 'Select [Name] 
        , ' + @x + ' as [TestCase] 
       From mytable' 

Exec (@Query) 

-- returns "Invalid column name 'test'" 

который возвращает ошибку упомянутую выше. Я хотел бы, чтобы достичь эквивалента:

Declare @Query nvarchar(1000) 
Declare @x nvarchar(40) 

Set @x = 'test' 
Set @Query = 'Select [Name] 
        , ''test'' as [TestCase] 
       From mytable' 

Exec (@Query) 

-- Returns e.g. 
-- Name TestCase 
-- Alice Test 
-- Bob Test 

Я также отметить, что следующий не работает и возвращает ту же ошибку, что и первый:

Declare @Query nvarchar(1000) 
Declare @x nvarchar(40) 

Set @x = 'test' 
Set @Query = 'Select [Name] 
        , ' + 'test' + ' as [TestCase] 
       From mytable' 

Exec (@Query) 

-- returns "Invalid column name 'test'" 

Основываясь на ошибках и, так как я 'Не пытаюсь использовать @x в качестве имени столбца, но как переменную, я предполагаю, что я использую недопустимую реализацию переменной.

ответ

2

Поскольку вы не пытаетесь использовать переменную как имя столбца, вы не необходимо использовать динамический SQL вообще.

Простой (который является хорошей вещью (TM), поскольку динамический SQL должен использоваться только с большой осторожностью из-за его большой атаку поверхности.):

declare @x nvarchar(40) 

set @x = 'test' 

select [Name], @x as TestCase 
from mytable 

будет делать.


Это, как говорится, если у вас есть случай использования динамического SQL (опять конкретный запрос, о котором идет речь здесь не только возможно, запрос одноранговой в настоящее время, передаваемым в порядке), что нужно сделать было бы передать вашу переменную в качестве параметра для запроса через sp_executesql. Это похоже на создание хранимой процедуры с параметрами:

declare @x nvarchar(40) 
declare @query nvarchar(1000) 

set @x = 'test' 

set @query = 'select [Name], @x as TestCase from mytable' 

exec sp_executesql @query, N'@x nvarchar(1000)', @x 
+0

О, отлично, спасибо! Это работало по желанию. – conor

+0

Принял этот ответ, поскольку он отвечает на мой вопрос наиболее тщательно и упрощает его - на самом деле мне не нужен динамический SQL. – conor

+2

Я рад, что это помогло. Чтобы ответить на вторую половину вопроса, вы можете попробовать «select @ query», чтобы увидеть, какой запрос состоит. Вы увидите 'select [Name], test as ...', который обрабатывает «test» как имя столбца. Вам нужно будет обернуть это в кавычки - как показывают другие ответы здесь. Но тогда вы вводите проблему «что произойдет, если' @ x' имеет в ней кавычки », демонстрируя опасность динамического SQL. Например, попробуйте 'set @x = 'test' ', Name, Name, Name,' 'hahaha'' с одним из ответов других ответов! –

1
Declare @Query nvarchar(1000) 
Declare @x nvarchar(40) 

Set @x = 'test' 
Set @Query = 'Select [Name],'++''''[email protected]+''''+ ' as [TestCase] 
       From mytable' 

print @query 

Выход:
Выберите [Имя], «тест», как [TestCase] ​​ От туЬаЫе

+0

Это сработало, но я не понимаю, что делают дополнительные '+' и одинарные кавычки. Не могли бы вы добавить объяснение? – conor

+0

@conor: попробуйте это..выбрать '', '' '', '' '' '' – TheGameiswar

2

Вам не хватало котировок. Это оно. Попробуйте ввести код ниже.

Declare @Query nvarchar(1000) 
    Declare @x nvarchar(40) 

    Set @x = 'test' 
    Set @Query = 'Select [Name] 
         , ''' + @x + ''' as [TestCase] 
        From mytable' 

    Exec (@Query) 
+0

Спасибо @ Ranjana. Зачем вам три одиночные кавычки? Я знаю, что два действия - это побег, но не знаю, что делают три. – conor

+0

Простая идея - это запрос выбора, который вы создали, для поиска столбца с именем test, поскольку он не существует, он выдает ошибку.Поскольку это значение столбца, поэтому вы должны передать его как «тест». С '' 'генерируется одна цитата, поэтому' '' + @ x + '' 'становится «тестом». с вашим запросом это будет выглядеть так: '+ @ x +' -> test. Поскольку тест не является именем столбца, поэтому возникает ошибка –

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