Форум программистов, компьютерный форум, киберфорум
Наши страницы
Microsoft SQL Server
Войти
Регистрация
Восстановить пароль
 
Рейтинг: Рейтинг темы: голосов - 13, средняя оценка - 4.85
I_like_C++
29 / 29 / 9
Регистрация: 15.03.2010
Сообщений: 146
Завершенные тесты: 1
#1

Таблица - глобальная переменная: как? - SQL Server

02.04.2012, 00:21. Просмотров 1885. Ответов 5
Метки нет (Все метки)

Собственно, вопрос в заголовке: как объявить/использовать глобальную переменную типа table?

Задание:
Найти сколько раз встречается каждая буква алфавита в названиях книг.
Вывод: буква, количество повторений

в кратце, что я делал:

создал функцию ABC_table(1) создает табллицу с русским алфавитом
потом я пытаюсь объявить глобальную переменную table

T-SQL
1
2
3
4
declare @@AbcTable table( word varchar(1),cnt int)
insert into @@AbcTable
select *
from dbo.ABC_table(1)
в функции fn_count_word я подсчитываю число каждой буквы в слове sValue и обновляю глабальную (как я думаю) таблицу AbcTable

но вывести результат не получается=(

T-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
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
IF OBJECT_ID (N'dbo.ABC_table') IS NOT NULL --существует ли функция 'dbo.ABC_table'? 
    DROP FUNCTION dbo.ABC_table;                        --если существует - удаляем ее
GO
--функция создает таблицу с буквами алфавита
create function [dbo].ABC_table (@privet as int)
    returns @mytable table ( word varchar(1), --буква
                    cnt int         --количество
                  )
as
begin
 
    declare @temp int=0
    while @temp < 32 --заполнение алфавита
    begin
        insert into @mytable values (CHAR(ASCII('а')+ @temp), 0)
        set @temp +=1
    end
return 
end
go
 
declare @@AbcTable table( word varchar(1),cnt int)
insert into @@AbcTable
select *
from dbo.ABC_table(1)
 
 
IF OBJECT_ID (N'dbo.fn_count_word') IS NOT NULL --существует ли функция 'dbo.fn_count_word? 
    DROP PROC dbo.fn_count_word;                        --если существует - удаляем ее
GO
--если не существует, то создаем ее
CREATE PROC [dbo].[fn_count_word] (@sValue as varchar(20))
    --RETURNS int
AS
BEGIN
 
DECLARE
        @strlen int,
        @curPos int,
        @temp varchar(1)
 
SET @strlen = LEN (@sValue) 
SET @curPos = 1
 
WHILE @curPos <= @strlen
    BEGIN
        set @temp = substring(@sValue, @curPos,1) --вырезаем по букве из названия
        
        update ##AbcTable --обновляем таблицу букв
        set ##AbcTable.cnt +=1
        where ##AbcTable.word = @temp
        set @curPos +=1
    END
RETURN
END
Go
 
select dbo.fn_count_word(name)
from book
 
select *
from @@AbcTable
--form ##AbcTable
на код сильно не ругайтесь....sql изучать я только начал
таблица Book если че вот
T-SQL
1
2
3
4
5
6
create table Book
(
    id_books int primary key Identity, 
    name varchar(50), 
    date_out datetime Default (GetDate())
)
СПАСИБО!
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
02.04.2012, 00:21
Я подобрал для вас темы с готовыми решениями и ответами на вопрос Таблица - глобальная переменная: как? (SQL Server):

Имя базы данных в скрипте как переменная
Здравствуйте! Не нашла подобной темы. Я не сильна в T-SQL, и нагуглить так...

Архив как таблица
Правильно ли создавать таблицу как архив из какой-то существующей таблицы. В...

CURSOR + временная таблица... Как сделать?
Есть проблема: во временную таблицу, имя которой каждый раз генериться и...

Как программно определить есть ли таблица и ее структуру в SQL
Проблема заключается в следующем. В приложение по работе с БД вводиться...

Как узнать, что на SQL Server изменилась таблица ?
Ранее хватало узнать было ли добавление в таблицу другим пользователем -...

Как узнать какая строка и таблица была обработана?
Здравствуйте. Подскажите пожалуйста, как можно узнать в какой таблице и строке...

5
iap
803 / 613 / 124
Регистрация: 27.11.2009
Сообщений: 1,817
02.04.2012, 10:17 #2
Зачем глобальная переменная (не бывает), зачем функция, слющай, а?
T-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
SET NOCOUNT ON;
declare @Book table
(
    id_books int primary key Identity, 
    name varchar(50), 
    date_out datetime Default (GetDate())
);
 
INSERT @Book([name]) VALUES
 ('Война и мир')
,('Капитанская дочка');
 
SELECT B.id_books, V.Symbol, V.[Count]
FROM @Book B
CROSS APPLY
(
 SELECT LOWER(SUBSTRING(B.[name],V.number,1)), COUNT(*)
 FROM master.dbo.spt_values V
 WHERE V.type='P'
   AND V. number BETWEEN 1 AND LEN(B.[name])
   AND SUBSTRING(B.[name],V.number,1)LIKE'[абвгдеёжзийклмнопрстуфхцчшщъыьэюяАБВГДЕЁЖЗИЙКЛМНОПРСТУФХЦЧШЩЪЫЬЭЮЯ]'
 GROUP BY LOWER(SUBSTRING(B.[name],V.number,1))
)V(Symbol,[Count])
ORDER BY B.id_books, V.Symbol;
1
I_like_C++
29 / 29 / 9
Регистрация: 15.03.2010
Сообщений: 146
Завершенные тесты: 1
02.04.2012, 10:44  [ТС] #3
спасибо, конечно... но твой запрос неадекватно работает, даже на твоих данных=)

Добавлено через 2 минуты
можно как нибудь мой запрос переделать, чтоб работало?) например, может отрпавлять в функцию переменную таблицу, чтоб она изменялась там? как это сделать?

Добавлено через 3 минуты
а не не не=) все правильно=) не догнал я че то, конструкция CROSS APPLY не совсем понятна, как то сложный метод=)

Добавлено через 7 минут
можешь пояснить что делает твой запрос? почему он не группируется по id_books?
0
iap
803 / 613 / 124
Регистрация: 27.11.2009
Сообщений: 1,817
02.04.2012, 13:07 #4
Цитата Сообщение от I_like_C++ Посмотреть сообщение
[size="1"]почему он не группируется по id_books?
Для каждого id_books получается много строк с разными символами.
Как же их надо отобразить в одной строке для каждого id_books? А?

Надо бы уточнить, что имеется в виду под "группируется по id_books"...
1
I_like_C++
29 / 29 / 9
Регистрация: 15.03.2010
Сообщений: 146
Завершенные тесты: 1
02.04.2012, 13:44  [ТС] #5
вопрос не по теме:

у меня есть таблица Book, там есть какие то значения, как мне взять оттуда например 3ий элемент и отправить в функцию?
0
pincet
1301 / 888 / 120
Регистрация: 23.07.2010
Сообщений: 4,804
02.04.2012, 15:50 #6
в таблице нет третьего элемента. можно попробывать найти элемент, с известным значением какого-либо поля. (чаще всего, индекса)
0
02.04.2012, 15:50
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
02.04.2012, 15:50
Привет! Вот еще темы с решениями:

Как выяснить запросом, есть ли таблица на сервере, или нет?
с помошью чего это можно выяснить ?

Глобальная переменная, как сделать
Здравствуйте, как объявить глобальную переменную единую для всех процедур.

Глобальная переменная определена в хидере. Компилятор ругается на то, что переменная переопределена несколько раз
Исходники: /* main.cpp */ #include &quot;hider.h&quot; int main(void) { return 0;...

Динамический массив как глобальная переменная
Доброго времени суток, даже с google никак не смогу разобраться со следующей...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
6
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2018, vBulletin Solutions, Inc.
Рейтинг@Mail.ru