Используйте sp_executesql
для выполнения любого SQL, например
DECLARE @tbl sysname,
@sql nvarchar(4000),
@params nvarchar(4000),
@count int
DECLARE tblcur CURSOR STATIC LOCAL FOR
SELECT object_name(id) FROM syscolumns WHERE name = 'LastUpdated'
ORDER BY 1
OPEN tblcur
WHILE 1 = 1
BEGIN
FETCH tblcur INTO @tbl
IF @@fetch_status <> 0
BREAK
SELECT @sql =
N' SELECT @cnt = COUNT(*) FROM dbo.' + quotename(@tbl) +
N' WHERE LastUpdated BETWEEN @fromdate AND ' +
N' coalesce(@todate, ''99991231'')'
SELECT @params = N'@fromdate datetime, ' +
N'@todate datetime = NULL, ' +
N'@cnt int OUTPUT'
EXEC sp_executesql @sql, @params, '20060101', @cnt = @count OUTPUT
PRINT @tbl + ': ' + convert(varchar(10), @count) + ' modified rows.'
END
DEALLOCATE tblcur
используйте pow
функция (она берет float
с / double
с хотя).
man pow
:
#include <math.h>
double pow(double x, double y);
float powf(float x, float y);
long double powl(long double x, long double y);
РЕДАКТИРОВАНИЕ: BTW, для особого случая положительных целочисленных полномочий 2
, можно использовать разрядное смещение: (1 << x)
будет равняться 2
питанию x
. Существуют некоторые потенциальные глюки с этим, но обычно это было бы корректно.
Добавить к какой сказанный Evan: C не имеет встроенного оператора для возведения в степень, потому что это не примитивная операция для большинства центральных процессоров. Таким образом это реализовано как библиотечная функция.
кроме того, для вычисления функционального e^x, можно использовать exp(double)
, expf(float)
, и expl(long double)
функции.
Примечание, которое Вы делаете не , хочет использовать ^
оператор, который является битовое исключающее "ИЛИ" оператор.
Нерекурсивная версия функции не слишком трудна - здесь это для целых чисел:
long powi(long x, unsigned n)
{
long p = x;
long r = 1;
while (n > 0)
{
if (n % 2 == 1)
r *= p;
p *= p;
n /= 2;
}
return(r);
}
(Взломанный из кода для повышения двойного значения к целочисленному питанию - должен был удалить код для контакта с обратными величинами, например.)
pow
только работы над числами с плавающей запятой (double
с, на самом деле). Если Вы захотите взять полномочия целых чисел, и основой, как известно, не является экспонента 2
, Вы будете иметь к самокрутке.
Обычно немой путь достаточно хорош.
int power(int base, unsigned int exp) {
int i, result = 1;
for (i = 0; i < exp; i++)
result *= base;
return result;
}
Вот рекурсивное решение, которое берет O(log n)
пространство и время вместо легкого O(1)
пространство O(n)
время:
int power(int base, int exp) {
if (exp == 0)
return 1;
else if (exp % 2)
return base * power(base, exp - 1);
else {
int temp = power(base, exp / 2);
return temp * temp;
}
}
или Вы могли просто записать функцию питания с рекурсией как добавленная премия
int power(int x, int y){
if(y == 0)
return 1;
return (x * power(x,y-1) );
}
да, да я знаю, что это - менее эффективная сложность пространства и времени, но рекурсия является просто большим количеством забавы!!