C# 如何在C中的SQL语句中设置值(datefirst)#
在C#中运行查询时,尝试设置DATEFIRST时遇到问题 首先,这是在SQLManagementStudio中工作的sql语句C# 如何在C中的SQL语句中设置值(datefirst)#,c#,sql-server,C#,Sql Server,在C#中运行查询时,尝试设置DATEFIRST时遇到问题 首先,这是在SQLManagementStudio中工作的sql语句 SET DATEFIRST 1; GO CREATE VIEW [Tannery_Data_View2] AS SELECT [week_day] = DATENAME(dw, Tannery_Values.date), [week_ending] = DATEADD(DAY, 7-DATEPART(WEEKDAY, dbo.Tannery_Values.date),
SET DATEFIRST 1;
GO
CREATE VIEW [Tannery_Data_View2] AS
SELECT [week_day] = DATENAME(dw, Tannery_Values.date), [week_ending] = DATEADD(DAY, 7-DATEPART(WEEKDAY, dbo.Tannery_Values.date), dbo.Tannery_Values.date), Tannery_Values.date, Tannery_Values.value, Variable_Titles.Variable, [Performance_Category] = Performance_Categories.Category, [Process_Category] = Process_Categories.Category
FROM Tannery_Values
INNER JOIN Variable_Titles ON Tannery_Values.variableTitleID=Variable_Titles.VariableID
INNER JOIN Performance_Categories ON Tannery_Values.performanceCategoryID=Performance_Categories.CategoryID
INNER JOIN Process_Categories ON Tannery_Values.processCategoryID=Process_Categories.CategoryID
这是我调用它的代码
public void executeNonQuery(string insertString)
{
sqlConnection.Open();
command.CommandType = System.Data.CommandType.Text;
command.CommandText = insertString;
command.Connection = sqlConnection;
command.ExecuteNonQuery();
sqlConnection.Close();
}
插入字符串是上面注释为字符串的sql语句。它抛出一个错误,即CREATE视图必须是批处理中的第一条语句。随后,我尝试使用create view SEparate将其分成两个查询,与set语句分开,但也不起作用。我的理解是ExecuteOnQuery不是这里使用的正确方法,因为计算机忘记了它已经设置好了?然而,我似乎找不到我真正需要做的事情
如果更简单的话,我可以运行一个存储过程并调用它,但我想知道我做错了什么。特别是因为我不容易找到答案,所以最好把它放在这里给别人 不能在视图中使用
SET DATEFIRST
可能最简单的方法是在运行视图之前在C#中生成它
cmd.CommandText = "SET DATEFIRST 1";
cmd.ExecuteNonQuery();
或者,实现这一目标的最佳方法是建立一个日期表
将一周的第一天设置为星期一后,您使用的SQL将创建一个视图。这没有意义,因为视图在实际运行时不会保留DATEFIRST设置 是否确实不希望DATEFIRST成为正在创建的视图的一部分
CREATE VIEW [Tannery_Data_View2] AS
SET DATEFIRST 1;
GO
SELECT [week_day] = DATENAME(dw, Tannery_Values.date), [week_ending] = DATEADD(DAY, 7-DATEPART(WEEKDAY, dbo.Tannery_Values.date), dbo.Tannery_Values.date), Tannery_Values.date, Tannery_Values.value, Variable_Titles.Variable, [Performance_Category] = Performance_Categories.Category, [Process_Category] = Process_Categories.Category
FROM Tannery_Values
INNER JOIN Variable_Titles ON Tannery_Values.variableTitleID=Variable_Titles.VariableID
INNER JOIN Performance_Categories ON Tannery_Values.performanceCategoryID=Performance_Categories.CategoryID
INNER JOIN Process_Categories ON Tannery_Values.processCategoryID=Process_Categories.CategoryID
或者您不只是想运行查询:
SET DATEFIRST 1;
GO
SELECT [week_day] = DATENAME(dw, Tannery_Values.date), [week_ending] = DATEADD(DAY, 7-DATEPART(WEEKDAY, dbo.Tannery_Values.date), dbo.Tannery_Values.date), Tannery_Values.date, Tannery_Values.value, Variable_Titles.Variable, [Performance_Category] = Performance_Categories.Category, [Process_Category] = Process_Categories.Category
FROM Tannery_Values
INNER JOIN Variable_Titles ON Tannery_Values.variableTitleID=Variable_Titles.VariableID
INNER JOIN Performance_Categories ON Tannery_Values.performanceCategoryID=Performance_Categories.CategoryID
INNER JOIN Process_Categories ON Tannery_Values.processCategoryID=Process_Categories.CategoryID
更新:
进一步检查后,SQL Server不允许在视图中使用DATEFIRST。我使用路德·米勒的理论()使用@@DateFirst计算周数
SELECT [week_day] = DATENAME(dw, Tannery_Values.date),
[week_ending] = DATEADD(DAY, 7-DATEPART(WEEKDAY, ((@@DATEFIRST - 1) % 7) + 1), dbo.Tannery_Values.date),
Tannery_Values.date, Tannery_Values.value, Variable_Titles.Variable,
[Performance_Category] = Performance_Categories.Category, [Process_Category] = Process_Categories.Category
FROM Tannery_Values
INNER JOIN Variable_Titles ON Tannery_Values.variableTitleID=Variable_Titles.VariableID
INNER JOIN Performance_Categories ON Tannery_Values.performanceCategoryID=Performance_Categories.CategoryID
INNER JOIN Process_Categories ON Tannery_Values.processCategoryID=Process_Categories.CategoryID
仍然从第一个错误中获取错误。它说单词set附近的语法不正确。有一件奇怪的事情说你不能在视图中使用DATEFIRST,我找不到任何理由。因为您只需要一次计算,所以我使用了Luhter Miller的Throry()-请参见上面的编辑。