我想更新 SQL Server 表中的记录。 查询如下所示:
UPDATE TutorAds
SET Status = 'expired', Published_At = NULL
WHERE Published_At < DATEADD(DAY, -7, GETDATE())
但是我找不到1天后更新记录的好例子。
我正在遵循此 Microsoft 指南。
以前我曾尝试这样做,但它仅在我本地运行该函数时更新表记录。部署后,不会更改数据库。
这是我在 VSCODE 中的函数代码:
const { app } = require('@azure/functions');
const { Connection, Request } = require('tedious');
require('dotenv').config();
app.timer('newtriggerexpre', {
schedule: '0 */2 * * * *',
handler: (myTimer, context) => {
const config = {
"server": process.env.SQL_SERVER,
"authentication": {
"type": "default",
"options": {
"userName": process.env.SQL_USERNAME,
"password": process.env.SQL_PASSWORD
}
},
"options": {
"port": 1433,
"database": "Tutoringacademy",
"trustServerCertificate": true
}
}
const connection = new Connection(config);
// Connect to SQL Server
connection.on('connect', async function (err) {
if (err) {
context.log.error(err);
return;
}
try {
// Calculate the date 7 days ago
const sevenDaysAgo = new Date();
sevenDaysAgo.setDate(sevenDaysAgo.getDate() - 7);
// Execute update query for records older than 7 days
const request = new Request(`
UPDATE TutorAds
SET Status = 'expired', Published_At = NULL
WHERE Published_At < DATEADD(DAY, -7, GETDATE())
`, function (err, rowCount) {
if (err) {
context.log.error(err);
return;
}
context.log(`${rowCount} rows were updated`);
});
request.addParameter('sevenDaysAgo', TYPES.DateTime, sevenDaysAgo);
connection.execSql(request);
} catch (err) {
context.log.error(err);
}
});
}
});
您正在尝试向请求添加参数 (
sevenDaysAgo
),但您没有在查询中使用它。您在查询中直接使用 DATEADD(DAY, -7, GETDATE())
而不是参数。
这里是带有定时器触发功能的上述参数的更新代码。
代码:
const { app } = require('@azure/functions');
const { Connection, Request, TYPES } = require('tedious');
require('dotenv').config();
app.timer('newtriggerexpre', {
schedule: '0 */2 * * * *',
handler: async (myTimer, context) => {
const config = {
"server": process.env.SQL_SERVER,
"authentication": {
"type": "default",
"options": {
"userName": process.env.SQL_USERNAME,
"password": process.env.SQL_PASSWORD
}
},
"options": {
"port": 1433,
"database": "Tutoringacademy",
"trustServerCertificate": true
}
}
const connection = new Connection(config);
connection.on('connect', async function (err) {
if (err) {
context.log.error(err);
return;
}
try {
const sevenDaysAgo = new Date();
sevenDaysAgo.setDate(sevenDaysAgo.getDate() - 7);
const request = new Request(`
UPDATE TutorAds
SET Status = 'expired', Published_At = NULL
WHERE Published_At < @sevenDaysAgo
`, function (err, rowCount) {
if (err) {
context.log.error(err);
return;
}
context.log(`${rowCount} rows were updated`);
connection.close();
});
request.addParameter('sevenDaysAgo', TYPES.DateTime, sevenDaysAgo);
connection.execSql(request);
} catch (err) {
context.log.error(err);
}
});
}
});
local.settings.json:
{
"IsEncrypted": false,
"Values": {
"AzureWebJobsStorage": "storage_connec",
"FUNCTIONS_WORKER_RUNTIME": "node",
"AzureWebJobsFeatureFlags": "EnableWorkerIndexing",
"SQL_SERVER": "<server_name>.database.windows.net",
"SQL_USERNAME": "<user_name>",
"SQL_PASSWORD": "<password>"
}
}
输出:
定时器触发功能成功运行如下,
确保您的 Azure Function 已正确部署,并且环境变量 SQL_SERVER、SQL_USERNAME 和 SQL_PASSWORD 如下所示,
Azure 门户: