DatasetQuery Stored Procedures (Referece) are precompiled SQL statements stored in the database that can be executed through Dataset Queries with parameters and return values. Stored Procedures enable:
sql
EXEC ProcedureName @Param1 = {{Tag.Value1}}, @Param2 = {{Tag.Value2}}
sql
-- Simple procedure
EXEC GetProductionData
-- With parameters
EXEC GetProductionByDate @Date = '{{Tag.QueryDate}}'
-- Multiple parameters
EXEC UpdateBatch
@BatchID = {{Tag.Batch_ID}},
@Status = {{Tag.Production_Status}},
@Operator = '{{Tag.Operator_Name}}'
sql
EXEC CalculateTotals
@StartDate = '{{Tag.StartDate}}',
@EndDate = '{{Tag.EndDate}}',
@Total = {{Tag.TotalProduction}} OUTPUT,
@Average = {{Tag.AverageRate}} OUTPUT
sql
EXEC ValidateData
@BatchID = {{Tag.Batch_ID}},
@ReturnValue = {{Tag.ValidationResult}} RETURN_VALUE
Use @null@
for null values:
sql
EXEC UpdateRecord
@ID = {{Tag.RecordID}},
@Notes = @null@,
@ModifiedBy = '{{Tag.Username}}'
csharp
// Execute stored procedure
@Dataset.Query.MyProcedure.ExecuteCommand();
// With status check
string status;
@Dataset.Query.MyProcedure.ExecuteCommandWithStatus(out status);
if (status == "OK")
{
// Process success
}
csharp
public void RunStoredProcedure()
{
// Build procedure call
string sql = string.Format(
"EXEC GetDataByLine @Line = '{0}', @Date = '{1}'",
@Tag.ProductionLine,
DateTime.Now.ToString("yyyy-MM-dd")
);
@Dataset.Query.ProcedureQuery.SqlStatement = sql;
// Execute
string status;
@Dataset.Query.ProcedureQuery.ExecuteCommandWithStatus(out status);
if (status == "OK")
{
@Tag.ExecutionResult = "Success";
}
}
sql
CREATE PROCEDURE [dbo].[GetProductionSummary]
@StartDate datetime,
@EndDate datetime,
@LineID int = NULL,
@TotalCount int OUTPUT,
@AvgRate float OUTPUT
AS
BEGIN
SET NOCOUNT ON;
-- Calculate totals
SELECT @TotalCount = COUNT(*),
@AvgRate = AVG(ProductionRate)
FROM Production
WHERE Timestamp BETWEEN @StartDate AND @EndDate
AND (@LineID IS NULL OR LineID = @LineID);
-- Return detailed data
SELECT LineID,
SUM(Count) as Total,
AVG(Rate) as AvgRate
FROM Production
WHERE Timestamp BETWEEN @StartDate AND @EndDate
AND (@LineID IS NULL OR LineID = @LineID)
GROUP BY LineID;
RETURN 0; -- Success
END
sql
CREATE OR REPLACE FUNCTION get_production_summary(
start_date timestamp,
end_date timestamp,
line_id integer DEFAULT NULL
)
RETURNS TABLE(
line_id integer,
total_count bigint,
avg_rate numeric
)
LANGUAGE plpgsql
AS $$
BEGIN
RETURN QUERY
SELECT p.line_id,
COUNT(*) as total_count,
AVG(p.rate) as avg_rate
FROM production p
WHERE p.timestamp BETWEEN start_date AND end_date
AND (line_id IS NULL OR p.line_id = line_id)
GROUP BY p.line_id;
END;
$$;
Type | SQL Server | PostgreSQL | MySQL |
---|---|---|---|
Input | @param | param_name | IN param |
Output | @param OUTPUT | OUT param | OUT param |
Input/Output | @param OUTPUT | INOUT param | INOUT param |
Return | RETURN | RETURNS | N/A |
sql
-- Create tables
CREATE TABLE Characteristic (
Char_Id int PRIMARY KEY,
Char_Desc varchar(25),
OptionsChar varchar(25)
);
CREATE TABLE Specification (
Spec_ID int PRIMARY KEY,
Spec_Desc varchar(25),
OptionsSpec varchar(25)
);
CREATE TABLE Active_Spec (
AS_ID int PRIMARY KEY,
Char_ID int,
Spec_ID int,
OptionsAS varchar(25)
);
sql
CREATE PROCEDURE [dbo].[TestSP]
@Char_Desc varchar(50)
AS
BEGIN
SET NOCOUNT ON;
DECLARE @Char_Id int;
SELECT @Char_Id = Char_Id
FROM Characteristic
WHERE Char_Desc = @Char_Desc;
SELECT c.Char_Desc,
s.Spec_Id,
s.Spec_Desc,
c.OptionsChar,
s.OptionsSpec,
asp.OptionsAS
FROM Specification s
JOIN Active_Spec asp ON asp.Spec_Id = s.Spec_Id
JOIN Characteristic c ON c.Char_Id = asp.Char_Id
WHERE c.Char_Id = @Char_Id;
END
sql
-- Query configuration
EXEC TestSP @Char_Desc = '{{Tag.CharacteristicDesc}}'
csharp
public void ExecuteProcedure()
{
@Tag.CharacteristicDesc = "C019";
string status;
@Dataset.Query.TestProcedure.ExecuteCommandWithStatus(out status);
if (status == "OK")
{
// Results available in mapped tags
DataTable results = @Tag.ProcedureResults;
}
}
Procedure not found:
Parameter errors:
Output not returned:
Performance issues: