2016-02-08 1 views
0

Поскольку мне нужно отправить запрос с запросом по почте, есть определенные ограничения. 1. Он должен быть одним лайнером 2. он должен быть создан в tempdb, так как я собираюсь удалить его позже. , так как SQL-сервер принимает оператор CREATE VIEW только в новой строке. Я подаю в строку новые символы строки. здесь является утверждение:Создание представления в tempdb в SQL Server через запрос на отправку

DECLARE @NewLineChar AS CHAR(2) = CHAR(13) + CHAR(10); ('USE tempdb;' [email protected] + 'GO' [email protected] +'CREATE VIEW temp_view AS select name from sys.databases') 

Этот запрос дает мне следующую ошибку:

Msg 102, Level 15, State 1. Incorrect syntax near 'USE tempdb;'. (Line 1)

что может быть проблема? Благодаря

редактировать: То же запрос работает, как этот

USE tempdb; 
GO 
CREATE VIEW temp_view AS select name from sys.databases 

, где есть ошибка синтаксиса?

+0

Почему бы не просто создать временную таблицу? –

+1

Что именно вы пытаетесь сделать? Это похоже на то, что вы пытаетесь присвоить некоторый SQL переменной, но на самом деле у вас нет переменной, вы просто объединяете некоторые строки без 'SELECT' или' SET' .... Это похоже на проблему [xy] (http://meta.stackexchange.com/a/66378/179361). Я не могу придумать ни одной (хорошей) причины, по которой вам нужно будет генерировать представление «на лету». – GarethD

+0

Мне не нужны данные. Мне просто нужно получить схему представления, которую я создаю, а затем я тоже отброшу представление. Заявление после «view AS» исходит от пользователя, который может быть любой, поэтому не хотите создавать таблицу, которая, возможно, заполнит tempdb – imran

ответ

3

Since SQL server takes CREATE VIEW statement only in new line I am feeding new line characters to the statement.

Я никогда не слышал о таком требовании. Что такое документация: CREATE VIEW должен быть первым оператором в пакете запросов.

Утверждение, которое у вас есть в вашем вопросе, не имеет смысла. Вы не можете просто удалить VARCHAR в SSMS и ожидать, что SQL Server просто выполнит его.

То, что вы, вероятно, хотите что-то вроде следующего:

USE tempdb; 
DECLARE @stmt NVARCHAR(MAX)=N'CREATE VIEW temp_view AS SELECT name FROM sys.databases;'; 
EXECUTE sp_executesql @stmt; 

Или в одной строке:

USE tempdb;DECLARE @stmt NVARCHAR(MAX)=N'CREATE VIEW temp_view AS SELECT name FROM sys.databases;';EXECUTE sp_executesql @stmt; 
+0

Поскольку заявление исходит из запроса Http post, оно должно быть в одной строке. Я должен объявить tempdb в начале партии, потому что «CREATE VIEW tempdb.dbo.temp_view ...» не принимается. сначала сделать эту строку в пакете. Я использую оператор GO непосредственно перед этим, и, наконец, я использую CHAR (13) + CHAR (10) для вставки LF/CR. мой запрос работает, когда я вставляю PRINT, как это, но не так, как я этого хочу. 'code' DECLARE @NewLineChar AS CHAR (2) = CHAR (13) + CHAR (10) PRINT ('USE tempdb;' + @ NewLineChar + ' GO '+ @ NewLineChar +' CREATE VIEW temp_view AS select name from sys.databases ') – imran

+0

@imran Я мало знаю о запросах HTTP POST. Я обновил свой вопрос, чтобы поставить все на одну строку. Может быть, это решит вашу проблему? –

+0

yep это работает именно так, как я хотел. благодаря – imran

1

Это немного для комментария.

Вы можете создать представление в текущей базе данных с таким именем, как _temp_<something>. Вы даже можете включить информацию о сеансе, если хотите эмулировать временные таблицы.

Или создать временную таблицу без каких-либо строк:

select top 0 * 
into #temp 
from <whatever>; 

Вы можете получить доступ к структуре этой таблицы.

Если вы используете самую последнюю версию SQL Server, используйте sp_describe_first_result_set (см. here).

+0

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

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