powered by simpleCommunicator - 2.0.55     © 2025 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / WinForms, .Net Framework [игнор отключен] [закрыт для гостей] / Динамические таблицы
15 сообщений из 15, страница 1 из 1
Динамические таблицы
    #38745529
dimasikus
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Здравствуйте! Всем.

В приложение я устанавливаю соединение с бд через "мастера настройки источников данных".
В приложении у меня в вызывается хранимая процедура из бд, которая создаёт таблицу и к ней преставление.
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
CREATE PROCEDURE NewTableShops @nameTable char(100)
AS

DECLARE @id int

INSERT INTO StoreShops (NameTable)
	VALUES (@nameTable)

SELECT @id = (SELECT MAX(IDTable) FROM StoreShops)

EXEC('CREATE TABLE TableShop' + @id + ' ' +
			'( ' +
				'IDShop int IDENTITY(1, 1) PRIMARY KEY, ' +
				'NameShop char(40) NOT NULL, ' +
				'Adress char(40) NULL, ' +
				'Telephone char(40) NULL, ' + 
				'IDTable int NOT NULL ' +
			')'
		)

EXEC('CREATE VIEW ViewShop' + @id + ' ' +
			'AS ' +
			'SELECT ' +
				'IDShop, ' +
				'RTRIM(NameShop) AS NameShop, ' +
				'RTRIM(Adress) AS Adress, ' +
				'RTRIM(Telephone) AS Telephone, ' +
				'IDTable ' +
			'FROM TableShop' + @id
		)



Суть проблемы такова: Как мне обратится к созданному процедурой представлению? Много искал в инете. но толкового не нашел (может коряво искал) и решил спросить совета. Заранее благодарен!
...
Рейтинг: 0 / 0
Динамические таблицы
    #38745539
Arm79
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
executesql(N'select * from ViewShop') ?
...
Рейтинг: 0 / 0
Динамические таблицы
    #38745549
dimasikus
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Это где писать?
...
Рейтинг: 0 / 0
Динамические таблицы
    #38745633
dimasikus
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
так у представления имя составное в имени присутствует id, так как таких представлений много. Я хотел использовать функцию
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
CREATE FUNCTION ViewShop (@id)
RETURNS TABLE
AS
RETURN
(
	SELECT IDShop,
				RTRIM(NameShop) AS NameShop,
				RTRIM(Adress) AS Adress,
				RTRIM(Telephone) AS Telephone,
				IDTable
	FROM TableShop + @id



но как в FROM правильно указать имя не знаю, посоветуйте как сделать?
...
Рейтинг: 0 / 0
Динамические таблицы
    #38745636
Arm79
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Я вас не понимаю. Exec('create view ...') вы сделать в состоянии, а exec('select * from View*') нет?
...
Рейтинг: 0 / 0
Динамические таблицы
    #38745646
dimasikus
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
я пробовал, но в функции не работает, еще я думал сделать процедуру но как вернуть из неё таблицу не знаю
...
Рейтинг: 0 / 0
Динамические таблицы
    #38745683
Arm79
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Microsoft SQL Server 2012 - 11.0.5058.0 (X64)
May 14 2014 18:34:29
Copyright (c) Microsoft Corporation
Express Edition (64-bit) on Windows NT 6.1 <X64> (Build 7601: Service Pack 1)



Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
sp_configure 'show advanced options', 1;
RECONFIGURE;
GO

sp_configure 'Ad Hoc Distributed Queries', 1;
RECONFIGURE;
GO

alter procedure dbo.Creator
as begin
	exec ('create view dbo.TestView (id1, id2) as select 1, 2 union select 3, 4')
end
GO

alter function dbo.FromView()
returns table 
as return
	select * from openrowset('SQLOLEDB','Server=(local);Integrated Security=SSPI;TRUSTED_CONNECTION=YES', 'Select * From [ИМЯ_ВАШЕЙ_БД].[dbo].[TestView]') as tmpTable
GO


select * from dbo.FromView()



Результат:
Код: plaintext
1.
2.
3.
4.
5.
6.
id1         id2
----------- -----------
1           2
3           4

(2 row(s) affected)
...
Рейтинг: 0 / 0
Динамические таблицы
    #38745712
Фотография Cat2
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Модератор форума
dimasikus,

Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
EXEC('CREATE TABLE dbo.TableShop' + @id + ' ' +
			'( ' +
				'IDShop int IDENTITY(1, 1) PRIMARY KEY, ' +
				'NameShop char(40) NOT NULL, ' +
				'Adress char(40) NULL, ' +
				'Telephone char(40) NULL, ' + 
				'IDTable int NOT NULL ' +
			')'
		)

EXEC('CREATE VIEW dbo.ViewShop' + @id + ' ' +
			'AS ' +
			'SELECT ' +
				'IDShop, ' +
				'RTRIM(NameShop) AS NameShop, ' +
				'RTRIM(Adress) AS Adress, ' +
				'RTRIM(Telephone) AS Telephone, ' +
				'IDTable ' +
			'FROM TableShop' + @id
		)
...
Рейтинг: 0 / 0
Динамические таблицы
    #38745713
Фотография Cat2
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Модератор форума
dimasikus,

Но сам подход дурацкий. Создавать таблицы и вьюхи програмно - плохая практика.

З.Ы. Тема для форума MS SQL, а не для NET
...
Рейтинг: 0 / 0
Динамические таблицы
    #38745721
dimasikus
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Cat2,
вы говорите подход дурацкий, вот мне надо чтобы таблицы пользователь сам создавал через приложение, я так решил сделать если можно по другому, то скажите как и посоветуйте где почитать
...
Рейтинг: 0 / 0
Динамические таблицы
    #38745722
dimasikus
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Arm79,
спасибо за помощь
...
Рейтинг: 0 / 0
Динамические таблицы
    #38745745
Arm79
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
dimasikus,

Подход простой. Пользователю нужно создавать бизнес-сущности. А уж сделать такую физическую модель, чтобы на нее ложились эти сущности - уже ваша задача. Как вариант, рассмотрите EAV
...
Рейтинг: 0 / 0
Динамические таблицы
    #38745748
Arm79
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Ну и еще, если у вас внешнее приложение, почему бы в нем динамически не формировать запрос с нужным представлением? Зачем извращаться на сервере?
...
Рейтинг: 0 / 0
Динамические таблицы
    #38746213
Фотография Cat2
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Модератор форума
dimasikus,

1. Вы вероятно не обратили внимание на то, почему сработал вариант от Arm79 и должен сработать мой вариант.
Потому что в обоих случаях явно указывался ее владелец - dbo.
Когда пользователь создает какой-то объект в базе, то по умолчанию полное имя будет

[Base].[Owner].[Name]
Таким образом ваши пользователи насоздают кучу табличек и вьюх с именами:

User1.TableShop1
User1.ViewShop1

User2.TableShop2
User3.ViewShop2

User3.TableShop3
User3.ViewShop3

Понятно, что select * from ViewShop3 ничего не вернет, а даст ошибку, что такой таблице нет. И действительно - вьюхи dbo.ViewShop3 не существует. Потому что опускать имя владельца можно только если он - dbo.

Таким образом Вы должны дать всем права dbo, что ОЧЕНЬ нехорошо

2. Я не знаю Вашей задачи, но она наверняка не уникальна и тривиальна. Зачем Вы плодите кучу табличек с одной записью в каждой для каждого магазина, если все их можно хранить в одной таблице TableShop и отличать их по IDShop?

3. Могу посоветовать почитать форум Проектирование БД или что-нибудь про основы проектирования баз данных

===============
Arm79, зачем вы человека непонятными словами пугаете?
EAV можно применить тогда, когда все другие пути еще хуже.
...
Рейтинг: 0 / 0
Динамические таблицы
    #38746231
Arm79
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Cat2Arm79, зачем вы человека непонятными словами пугаете?
EAV можно применить тогда, когда все другие пути еще хуже.
Хе :-) По сравнению с динамическим созданием таблиц и представлений EAV - вершина архитектурной мысли.
...
Рейтинг: 0 / 0
15 сообщений из 15, страница 1 из 1
Форумы / WinForms, .Net Framework [игнор отключен] [закрыт для гостей] / Динамические таблицы
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]