Я бы создал временную таблицу с различными значениями для evid, place, Officer, Trident и всех других полей, которые должны различаться:
SELECT
MIN(item) AS "item"
, evid
, place
, officer
, trident
, SPACE(100) AS "roles"
INTO #tmp
FROM table
GROUP BY
, evid
, place
, officer
, trident
UPDATE #tmp SET roles = '';
На следующем шаге вы должны агрегировать роли Поскольку ADS не имеет функции STRING_AGG
, вы должны делать это с помощью курсоров, циклов и т. д.
Я уже писал такой код раньше, , посмотрите здесь , например.
Затем вы можете просто удалить всю исходную таблицу и вставить данные из временной таблицы. В идеале я бы сделал эти последние шаги в транзакции.
BEGIN TRANSACTION;
DELETE FROM table;
-- Assuming the table and the temp table have the same exact fields
INSERT INTO table SELECT * FROM #tmp;
END TRANSACTION;
Вы можете получить его, используя arguments.callee
.
Однако вам, возможно, придется разобрать имя, так как оно, вероятно, будет содержать дополнительный мусор . Хотя в некоторых реализациях вы можете просто получить имя, используя arguments.callee.name
.
Анализ:
function DisplayMyName()
{
var myName = arguments.callee.toString();
myName = myName.substr('function '.length);
myName = myName.substr(0, myName.indexOf('('));
alert(myName);
}
Источник: Javascript - получить текущее имя функции .
Название текущей функции и как это может быть получено, кажется, переключило прошлые 10 лет, так как этот вопрос задали.
Теперь, не будучи про веб-разработчиком, который знает обо всех историях всех браузеров, когда-либо существовавших, вот то, как это работает на меня в браузере Chrome 2019 года:
function callerName() {
return callerName.caller.name;
}
function foo() {
let myname = callerName();
// do something with it...
}
Некоторые из других ответов столкнулись с некоторыми хромовыми ошибками о строгом коде JavaScript и этажерке.
Поскольку у вас есть написал функцию с именем foo
, и вы знаете, что она находится в myfile.js
, почему вам нужно получать эту информацию динамически?
При этом вы можете использовать аргументы. вызываемый.toString ()
внутри функции (это строковое представление всей функции) и регулярное выражение для значения имени функции.
Вот функция, которая выдаст собственное имя:
function foo() {
re = /^function\s+([^(]+)/
alert(re.exec(arguments.callee.toString())[1]);
}
Это должно сработать:
var fn = arguments.callee.toString().match(/function\s+([^\s\(]+)/);
alert(fn[1]);
Для вызывающего просто используйте caller.toString ()
.
Для неанонимных функций
function foo()
{
alert(arguments.callee.name)
}
Но в случае обработчика ошибок результатом будет имя функции обработчика ошибок, не так ли?
Это должно входить в категорию «самых уродливых взломов в мире», но вот, пожалуйста.
Сначала напечатайте имя ] Текущая функция (как и в других ответах), кажется, имеет для меня ограниченное применение, поскольку вы вроде уже знаете, что это за функция!
Однако определение имени вызывающей функции может быть очень полезным для функции трассировки. Это с регулярным выражением, но использование indexOf будет примерно в 3 раза быстрее:
function getFunctionName() {
var re = /function (.*?)\(/
var s = getFunctionName.caller.toString();
var m = re.exec( s )
return m[1];
}
function me() {
console.log( getFunctionName() );
}
me();
Другим вариантом использования может быть диспетчер событий, привязанный во время выполнения:
MyClass = function () {
this.events = {};
// Fire up an event (most probably from inside an instance method)
this.OnFirstRun();
// Fire up other event (most probably from inside an instance method)
this.OnLastRun();
}
MyClass.prototype.dispatchEvents = function () {
var EventStack=this.events[GetFunctionName()], i=EventStack.length-1;
do EventStack[i]();
while (i--);
}
MyClass.prototype.setEvent = function (event, callback) {
this.events[event] = [];
this.events[event].push(callback);
this["On"+event] = this.dispatchEvents;
}
MyObject = new MyClass();
MyObject.setEvent ("FirstRun", somecallback);
MyObject.setEvent ("FirstRun", someothercallback);
MyObject.setEvent ("LastRun", yetanothercallback);
Преимущество здесь в том, что диспетчер можно легко повторно использовать и ему не нужно получать очередь отправки в качестве аргумента, вместо этого это подразумевается с именем вызова ...
В конце, общий случай, представленный здесь, будет «использование имени функции в качестве аргумента, чтобы вам не приходилось передавать его явно», и это может быть полезно во многих случаях, например, jquery animate () необязательный обратный вызов или в обратных вызовах таймаутов / интервалов (т.е. вы передаете только ИМЯ функции).