Как я возвращаю новое значение столбца ИДЕНТИФИКАЦИОННЫХ ДАННЫХ из оператора SELECT SQLServer?

Вот один из способов: создать объект с именем Row для хранения каждой строки, а затем создать java.util.HashMap, ключи которого - целочисленные sij, а значения - соответствующие строки.

public class Example
{
  public static class Row
  {
    public Integer sij;
    public Integer i;
    public Integer j;
    public Row(Integer sij, Integer i, Integer j)
    {
      this.sij = sij;
      this.i = i;
      this.j = j;
    }
  }

  public static void main(String[] args)
  {
    Row r1 = new Row(45, 5, 7);
    Row r2 = new Row(33, 1, 6);
    Row r3 = new Row(31, 0, 9);
    Row r4 = new Row(12, 8, 2);
    Map<Integer, Row> map = new TreeMap<Integer, Row>();
    map.put(r1.sij, r1);
    map.put(r2.sij, r2);
    map.put(r3.sij, r3);
    map.put(r4.sij, r4);
    for ( Row row : map.values() ) {
        System.out.println("sij: " + row.sij + " i: " + row.i + " j: " + row.j);
    }
  }
}

Когда это работает, он производит:

sij: 12 i: 8 j: 2
sij: 31 i: 0 j: 9
sij: 33 i: 1 j: 6
sij: 45 i: 5 j: 7
11
задан gbn 26 June 2009 в 06:18
поделиться

7 ответов

В общем, это невозможно сделать с помощью одного оператора.

Но SELECT SCOPE_IDENTITY () может (и должен) размещаться непосредственно после оператора INSERT, так что все готово в том же вызове базы данных.

Пример:

mydb.ExecuteSql("INSERT INTO table(foreign_key1, value) VALUES(9, 'text'); SELECT SCOPE_IDENTITY();");

Вы можете использовать OUTPUT, но у него есть некоторые ограничения, о которых вы должны знать:

http://msdn.microsoft.com/en-us/library/ms177564 .aspx

17
ответ дан 3 December 2019 в 02:11
поделиться

Это зависит от вашего вызывающего контекста.

Если вы вызываете это из клиентского кода, вы можете использовать ВЫХОД, а затем прочитать возвращаемое значение.

DECLARE @t TABLE (ColID int IDENTITY, ColStr varchar(20))

INSERT INTO @t (ColStr)
OUTPUT Inserted.ColID
VALUES ('Hello World')

Результат:

      ColID
-----------
          1

Если вы обертываете это в хранимой процедуре, использование OUTPUT - это больше работы. Там вы захотите использовать SCOPE_IDENTITY (), но вы не можете сделать это с помощью одного оператора. Конечно, вы можете поместить несколько операторов в одну строку с помощью символа ';' разделитель, но это не один оператор.

DECLARE @idValue    int
DECLARE @t TABLE (ColID int IDENTITY, ColStr varchar(20))

INSERT INTO @t (ColStr) VALUES ('Hello World')

SELECT @idValue = SCOPE_IDENTITY()

Результат: переменная @idValue содержит значение идентичности. Используйте параметр OUTPUT, чтобы вернуть значение.

2
ответ дан 3 December 2019 в 02:11
поделиться
SELECT SCOPE_IDENTITY()

Редактировать: Есть игра ...

Если бы только предложение OUTPUT поддерживало локальные переменные.

В любом случае, чтобы получить диапазон идентификаторов, а не singleton

DECLARE @Mytable TABLE (keycol int IDENTITY (1, 1), valuecol varchar(50))

INSERT @Mytable (valuecol) 
OUTPUT Inserted.keycol
SELECT 'harry'
UNION ALL
SELECT 'dick'
UNION ALL
SELECT 'tom'

Редактировать 2: За один вызов. У меня никогда не было возможности использовать эту конструкцию.

DECLARE @Mytable TABLE (keycol int IDENTITY (1, 1), valuecol varchar(50))

INSERT @Mytable (valuecol) 
OUTPUT Inserted.keycol
VALUES('foobar')
9
ответ дан 3 December 2019 в 02:11
поделиться

Помимо @@ IDENTITY, вам также следует изучить SCOPE_IDENTITY () и IDENT_CURRENT (). Скорее всего, вам понадобится SCOPE_IDENTITY (). У @@ IDENTITY есть проблема, заключающаяся в том, что он может возвращать значение идентификатора, созданное в триггере в реальной таблице, которую вы пытаетесь отслеживать.

Кроме того, это функции с одним значением. Я не знаю, как работает ключевое слово Oracle RETURNING.

4
ответ дан 3 December 2019 в 02:11
поделиться

SCOPE_IDENTITY

2
ответ дан 3 December 2019 в 02:11
поделиться

Вы можете неявно преобразовать массив символов в LPCSTR без каких-либо преобразований:

void SomeFunction(LPCSTR aString);
...
char myArray[] = "hello, world!";
SomeFunction(myArray);

LPCSTR - это определение типа Windows для длинного указателя на постоянная строка. Еще в темные времена программирования Win16 были разные типы указателей: ближние указатели и дальние указатели, иногда также известные как короткие и длинные. указатели соответственно. Ближние указатели могли указывать только на сегмент памяти размером 64 КБ, определяемый одним из сегментных регистров x86. Далекие указатели могут указывать на что угодно. В настоящее время в Win32 с виртуальной памятью нет необходимости в ближних указателях - все указатели длинные.

Итак, LPSTR - это определение типа для char * или указателя к строке. LPCSTR - это версия const , т.е. это typedef для const char * . В C массивы распадаются на указатели на свои первые элементы, поэтому char [] распадается на char * . Наконец, любой тип «указателя на T» (для любого типа T) может быть неявно преобразован в «указатель на const T». Таким образом, объединив эти три факта, мы видим, что мы можем неявно преобразовать char [] в LPCSTR .


В ответ на ваше изменение, я собираюсь предположить, что вы компилируете приложение Unicode. Если вы внимательно посмотрите документацию для CreateFile () , вы заметите, что параметр имени файла на самом деле является LPCTSTR , а не LPCSTR ( обратите внимание на T ).

Практически для каждой функции Win32, которая принимает аргумент некоторого строкового типа (возможно, косвенно, т.е. как член структуры, переданной в качестве параметра), на самом деле существует две версии этой функции: одна, которая принимает 8-битный ANSI строки, и тот, который принимает строки 16-битных широких символов. Чтобы получить фактические имена функций, вы добавляете A или W к имени функции. Итак, ANSI-версия CreateFile () называется CreateFileA () , а версия для широких символов - CreateFileW () . В зависимости от того, компилируете ли вы с включенным Unicode (т.е. определен ли символ препроцессора _UNICODE ),

0
ответ дан 3 December 2019 в 02:11
поделиться

INSERT INTO table (foreign_key1, value) VALUES (9, 'text'); SELECT @@ IDENTITY;

0
ответ дан 3 December 2019 в 02:11
поделиться
Другие вопросы по тегам:

Похожие вопросы: