CTE с динамическим запросом -- sql-server поле с участием tsql пол Связанный проблема

CTE with dynamic query


2
vote

проблема

русский

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

 <код> INSERT INTO @outTable   EXEC sp_executesql @query;   

Проблема в том, что <код> @outTable должен измениться при добавлении столбца в <код> @query - <код> @query - это другая сохраненная процедура.

Я пытался использовать CTE (<код> ps r | wc 0 ), но он не работает с ps r | wc 1 .

Это возможно сделать в T-SQL?

что-то вроде этого

 <код> ps r | wc 2  
Английский оригинал

I have a dynamic query which I call and I put the Result set in a variable table

INSERT INTO @outTable   EXEC sp_executesql @query; 

The problem is that @outTable should change When adding column in @query - @query is another stored procedure.

I tried to use a CTE (WITH), but it does not work with EXEC.

Is this possible do to in T-SQL?

Something like this

DECLARE @outTable TABLE (                             ID int,                             Record_ID int,                              Order_ID nchar(16),                             ...and around 30 columns                         );        SET @query = N'EXEC [OrderDep].[Order_Find] @FreeWhere =N'' WHERE '+ @Where +'''';      BEGIN TRY          INSERT INTO @outTable              EXEC sp_executesql @query;      END TRY          BEGIN CATCH 
</div
     
 
 

Список ответов

2
 
vote
vote
Лучший ответ
 

При использовании ps0 определение таблицы должно соответствовать выходу из сохраненной процедуры.

Поскольку вы создаете оператор ps1 , вы, вероятно, знаете, что он собирается вернуться. Это может быть много работы, но вам придется отрегулировать определение таблицы вручную.

 

When using insert ... exec ..., the table definition must match the output from the stored procedure.

Since you're creating the @query statement, you probably know what it's going to return. It may be a lot of work, but you'll have to adjust the table definition by hand.

</div
 
 
 
 
2
 
vote

Прочитайте это и быть просвещенным.

Вы нужны , чтобы прочитать это, если вы собираетесь бросать динамический SQL вокруг:

 

Read this and be enlightened.

You need to read this if you are going to be throwing dynamic SQL around:

</div
 
 
1
 
vote

Учитывая то, что мы знаем о проблеме до сих пор, способ решения этой проблемы состоит в том, чтобы либо вилить логику для использования различных запросов с разными таблицами назначения или использовать динамический SQL. Если количество таблиц назначения невелика, то я бы порекомендовал бывшее решение, которое будет выглядеть так:

 <код> ps2  

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

 

Given what we know of the problem so far, the way to solve this problem is to either fork the logic to use different queries with different destination tables or use dynamic SQL. If the number of destination tables is small, then I'd recommend the former solution which would look like:

If @Parameter = 'SomeValue'     Insert TableA     Select ..     From ...  Else If @Parameter = 'SomeOtherValue'     Insert TableB     Select ..     From  

I would recommend against trying to make an all encompassing function that can take any destination table name and the text of a select query and make an insert statement if that is what you are trying to achieve.

</div
 
 
 
 
0
 
vote

Это вроде зависит от того, что вы хотите, чтобы это переменная.

Я подозреваю, что ваш самый простой выход будет хранить данные в поворотной форме и оставить ее таким образом, пока она не будет возвращена в приложение клиента. Затем сохраненные Proc могут построить SQL, необходимый для UnPivot результат.

Store и обрабатывать что-то вроде этого:

 <код> ID       Col         Value ----------------------------------------------------- 1        FName       Dag 1        Email       yeah.right@maybe.no 1        Col3        Value3 ... N        FName       Kristina N        Email       my.first.love@sadness.info N        Col3        Value3 N        Col4        Dag hasn't got this attribute   

Когда пришло время вернуть данные в клиентское приложение, а не ранее, сохраненные Proc могут динамически генерировать SQL, чтобы записать данные в это:

 <код> ID    FName     Email                        Col3      Col4 ------------------------------------------------------------------------------------ 1     Dag       yeah.right@maybe.no          Value3    (null) .... N     Kristina  my.first.love@sadness.info   Value3   Dag hasn't got this attribute.   

Конечно, набор столбцов будет такой же большой, как набор различных значений имени в таблице данных поворота. Но это хорошо работает, если вы храните много видов объектов в одной таблице, но выберите только наборы элементов с одинаковыми (или, по крайней мере, аналогичными) наборами атрибутов. Еще одно потенциально важное ограничение: все будет просто текст, поэтому рассмотрите последствия этого.

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

unnapivot, генерировать sql с помощью такого рисунка:

 <код> SELECT      ID,     MAX(CASE WHEN [Name] = 'FName' THEN [Value] END [FName]),     MAX(CASE WHEN [Name] = 'Email' THEN [Value] END [EMail]),     ... FROM      Stuff GROUP BY      ID   

до тех пор, пока есть больше одного ряда с именем = 'fname', это хорошо работает, поскольку мы группируем ID. И генерация SQL является простым; Только бит корпуса нуждается в любом форматировании:

 <код> DECLARE @case varchar(max) SET @case = 'CASE WHEN [Name] = ''§name'' THEN [Value] END [§name])'  -- Get columns: SELECT Column_Name INTO #cols FROM INFORMATION_SCHEMA.COLUMNS WHERE Table_Name = @tableName;  -- in loop (can't be bothered to include the code!) SET @sql = @sql + REPLACE(@case, '§name', @colName) ... EXEC(@sql)   
 

It sort of depends what you want that variable for.

I suspect though that your easiest way out would be to store the data in pivoted form and leave it that way all the way until it's to be returned to the client application. Then a stored proc can build the SQL needed to unpivot the result.

Store and process something like this:

ID       Col         Value ----------------------------------------------------- 1        FName       Dag 1        Email       yeah.right@maybe.no 1        Col3        Value3 ... N        FName       Kristina N        Email       my.first.love@sadness.info N        Col3        Value3 N        Col4        Dag hasn't got this attribute 

When it's time to return the data to the client app, and not before, a stored proc can dynamically generate the SQL to unpivot the data into this:

ID    FName     Email                        Col3      Col4 ------------------------------------------------------------------------------------ 1     Dag       yeah.right@maybe.no          Value3    (null) .... N     Kristina  my.first.love@sadness.info   Value3   Dag hasn't got this attribute. 

Of course, the column set will be as large as the set of distinct Name values in the pivoted data table. But this works well if you store many kinds of objects in a single table but select only sets of items with the same (or at least similar) sets of attributes. Another potentially important restriction: EVERYTHING will be just text, so consider the implications of that.

However, I've been thinking about making use of this technique to make a DAL for rapid prototyping purposes. It is obviously very costly in time and space compared to normalized tables but it does make it possible to store, retrieve and process smaller quantities of data in a generic fashion.

To unpivot, generate SQL using a pattern like this:

SELECT      ID,     MAX(CASE WHEN [Name] = 'FName' THEN [Value] END [FName]),     MAX(CASE WHEN [Name] = 'Email' THEN [Value] END [EMail]),     ... FROM      Stuff GROUP BY      ID 

As long as there's at most one row with Name = 'FName' this works out well, since we group by ID. And generating the SQL is straightforward; only the CASE bit needs any formatting:

DECLARE @case varchar(max) SET @case = 'CASE WHEN [Name] = ''§name'' THEN [Value] END [§name])'  -- Get columns: SELECT Column_Name INTO #cols FROM INFORMATION_SCHEMA.COLUMNS WHERE Table_Name = @tableName;  -- in loop (can't be bothered to include the code!) SET @sql = @sql + REPLACE(@case, '§name', @colName) ... EXEC(@sql) 
</div
 
 

Связанный проблема

0  Как настроить SQL Server Max Использование памяти  ( How to configure sql server max memory usage ) 
Я использую Enterprise SQL Server 2008. SQL Server 2008 всегда пытается съесть как можно больше памяти. Любые способы настроить в базу данных или на экземпляр...

0  Listbox пуст после привязки его к источнику данных (база данных SQL Server): C #, формы Windows  ( Listbox is empty after binding it to a data source sql server database c wi ) 
Всякий раз, когда я вставляю значения в свои текстовые коробки для форм и нести эту информацию в следующую форму, список Listbox, к которому следует связать д...

1  Запрос содержащий логику  ( Query containing logic ) 
<код> empno emailID -------------------- 1 A@gm.com 2 B@gm.com 3 C@gm.com 2 BB@gm.com 1 AA@gm.com 1 ...

1  C # код для объемного обновления SQL Server  ( C sharp code to bulk update sql server ) 
У нас есть этот код C #, который будет обновлять таблицу базы данных SQL Server на основе флагов в структуре. <код> public struct stSRK { public string...

28  SQL Server: Как использовать совокупную функцию, такую ​​как Max в пункте, где  ( Sql server how to use an aggregate function like max in a where clause ) 
Я хочу получить максимальное значение для этой записи. Пожалуйста, помогите мне: <код> SELECT rest.field1 FROM mastertable AS m INNER JOIN ( ...

5  Создание экземпляра базы данных в C #  ( Creating a database instance in c sharp ) 
Можно ли создать экземпляр базы данных SQL с C # код. У меня нет проблем с добавлением базы данных к существующему экземпляру SQL, например Wonea Sqlexpress,...

66  SQL Server - Запуск больших файлов сценариев  ( Sql server running large script files ) 
У меня есть таблица базы данных на сервере разработки, который теперь полностью заполнен после того, как установил его, работающий с процедурой импорта для фа...

0  Как узнать из SQLException, если подключение к SQL Server не удалось? [Дубликат]  ( How to know from sqlexception if connecting to sql server failed ) 
<в сторону CLASS = "S-NEWACTS S-WELTIVE__info JS-Post-New Imide MB16« Роль = «Статус»> Этот вопрос уже есть ответы здесь : ...

1  Как сопоставить две поля электронной почты, где один содержит дружественный адрес электронной почты  ( How to match two email fields where one contains friendly email address ) 
Одна таблица имеет «<код> s1 --1--1--1--| s2 ---2---2---2| r --12-1-21--2| 3 », а другой имеет «код> s1 --1--1--1--| s2 ---2---2---2| r --12-1-21--2| 4 ». С...

0  Учитывая пустую строку в нуле в запросе  ( Considering empty string to null in query ) 
Я использую <код> sql server R2 . У меня есть сохраненная процедура, в которой я передаю два параметра, как <код> @username varchar(100) и <код> @password va...

2890  Добавьте столбец с значением по умолчанию на существующую таблицу в SQL Server  ( Add a column with a default value to an existing table in sql server ) 
Как я могу добавить столбец с значением по умолчанию на существующую таблицу в SQL Server 2000 / SQL Server 2005 ? ...

0  Как создать просмотр, листья всей дружбы для таблицы «Friend1, Frim2» в T-SQL и предотвратить вставлять дубликаты?  ( How to create view listing all friendship for friend1 friend2 table in t sql a ) 
У меня есть таблица, определяемая следующим образом: <код> CREATE TABLE [dbo].[Friendships] ( [friendship_id] INT NOT NULL, [friend1] INT NOT...

38  SQL Server тупики между выбором / обновлением или несколькими выборами  ( Sql server deadlocks between select update or multiple selects ) 
Вся документация на сервере SQL Server Toblocks рассказывает о сценарии, в котором операция 1 блокирует ресурс a, затем пытается получить доступ к ресурсу B и...

35  Оператор резервного копирования командной строки SQL Server  ( Sql server command line backup statement ) 
Один из них знает, есть ли способ сценария резервного копирования SQL Server в пакетном файле, чтобы он мог выполнен из командной строки? ...

141  Получение только месяц и год от даты SQL  ( Getting only month and year from sql date ) 
Мне нужно добраться только к месяцу. Возникновение из поля даты в SQL Server. ...

Связанный проблема

0  Как настроить SQL Server Max Использование памяти 
0  Listbox пуст после привязки его к источнику данных (база данных SQL Server): C #, формы Windows 
1  Запрос содержащий логику 
1  C # код для объемного обновления SQL Server 
28  SQL Server: Как использовать совокупную функцию, такую ​​как Max в пункте, где 
5  Создание экземпляра базы данных в C # 
66  SQL Server - Запуск больших файлов сценариев 
0  Как узнать из SQLException, если подключение к SQL Server не удалось? [Дубликат] 
1  Как сопоставить две поля электронной почты, где один содержит дружественный адрес электронной почты 
0  Учитывая пустую строку в нуле в запросе 
2890  Добавьте столбец с значением по умолчанию на существующую таблицу в SQL Server 
0  Как создать просмотр, листья всей дружбы для таблицы «Friend1, Frim2» в T-SQL и предотвратить вставлять дубликаты? 
38  SQL Server тупики между выбором / обновлением или несколькими выборами 
35  Оператор резервного копирования командной строки SQL Server 
141  Получение только месяц и год от даты SQL