我需要ALTER表中几列的数据类型.
对于单个列,以下工作正常:
ALTER TABLE tblcommodityOHLC
ALTER COLUMN
CC_CommodityContractID NUMERIC(18,0)
Run Code Online (Sandbox Code Playgroud)
但是如何在一个语句中更改多个列?以下不起作用:
ALTER TABLE tblcommodityOHLC
ALTER COLUMN
CC_CommodityContractID NUMERIC(18,0),
CM_CommodityID NUMERIC(18,0)
Run Code Online (Sandbox Code Playgroud) 这是我过去花了几个小时研究的问题.在我看来,这应该是现代RDBMS解决方案应该解决的问题,但到目前为止,我还没有发现任何真正解决我认为在具有数据库后端的任何Web或Windows应用程序中非常普遍的需求.
我说的是动态排序.在我的幻想世界中,它应该像以下一样简单:
ORDER BY @sortCol1, @sortCol2
Run Code Online (Sandbox Code Playgroud)
这是遍布Internet 的新手SQL和存储过程开发人员给出的典型示例."为什么这不可能?" 他们问.总是有人最终会向他们讲述存储过程的编译性质,一般的执行计划,以及为什么不能将参数直接放入ORDER BY子句的各种其他原因.
我知道你们中有些人已经在想:"让客户进行排序." 当然,这会从数据库中卸载工作.然而,在我们的案例中,我们的数据库服务器甚至没有在99%的时间里出汗,它们甚至还没有多核,或者每6个月发生一次对系统架构的任何其他改进.仅仅因为这个原因,让我们的数据库处理排序不会有问题.另外,数据库非常好擅长排序.它们已针对它进行了优化,并且已经有多年时间才能做到正确,这样做的语言非常灵活,直观且简单,而且最重要的是,任何初学SQL编写者都知道如何去做,更重要的是他们知道如何编辑它,进行更改,进行维护等等.当您的数据库远非被征税而您只想简化(并缩短!)开发时间时,这似乎是一个明显的选择.
然后是网络问题.我已经使用了JavaScript来对HTML表进行客户端排序,但是它们不可避免地对我的需求不够灵活,而且,因为我的数据库没有过度征税而且可以非常容易地进行排序,我很难证明重写或滚动我自己的JavaScript分拣机所需的时间.服务器端排序通常也是如此,尽管它已经比JavaScript更受欢迎了.我不是特别喜欢DataSet的开销的人,所以起诉我.
但这又说明了这是不可能的 - 或者更确切地说,不容易.在先前的系统中,我已经完成了一种令人难以置信的黑客方式来获得动态排序.它不漂亮,不直观,简单或灵活,初学者SQL编写器会在几秒钟内丢失.这已经不仅仅是一个"解决方案",而是一个"复杂化".
以下示例并不意味着公开任何类型的最佳实践或良好的编码风格或任何内容,也不表示我作为T-SQL程序员的能力.他们就是这样,我完全承认他们是混乱,糟糕的形式,只是简单的黑客.
我们将一个整数值作为参数传递给存储过程(让我们调用参数只是"排序"),然后从中确定一堆其他变量.例如......让我们说sort是1(或默认值):
DECLARE @sortCol1 AS varchar(20)
DECLARE @sortCol2 AS varchar(20)
DECLARE @dir1 AS varchar(20)
DECLARE @dir2 AS varchar(20)
DECLARE @col1 AS varchar(20)
DECLARE @col2 AS varchar(20)
SET @col1 = 'storagedatetime';
SET @col2 = 'vehicleid';
IF @sort = 1 -- Default sort.
BEGIN
SET @sortCol1 = @col1;
SET @dir1 = 'asc';
SET @sortCol2 = @col2; …Run Code Online (Sandbox Code Playgroud) 我想把'1,2,3,4,5,6,7,8,9,10,11,12,13,14,15 ......'(逗号分隔)拆分成表或表变量.
有没有人有一个函数可以连续返回每一个?
我试图将数组参数传递给C#中的SQL commnd,如下所示,但它不起作用.有没有人见过它?
string sqlCommand = "SELECT * from TableA WHERE Age IN (@Age)";
SqlConnection sqlCon = new SqlConnection(connectString);
SqlCommand sqlComm = new SqlCommand();
sqlComm.Connection = sqlCon;
sqlComm.CommandType = System.Data.CommandType.Text;
sqlComm.CommandText = sqlCommand;
sqlComm.CommandTimeout = 300;
sqlComm.Parameters.Add("@Age", SqlDbType.NVarChar);
StringBuilder sb = new StringBuilder();
foreach (ListItem item in ddlAge.Items)
{
if (item.Selected)
{
sb.Append(item.Text + ",");
}
}
sqlComm.Parameters["@Age"].Value = sb.ToString().TrimEnd(',');
Run Code Online (Sandbox Code Playgroud) 我有一个使用IN运算符的Transact-SQL查询.像这样的东西:
select * from myTable where myColumn in (1,2,3,4)
Run Code Online (Sandbox Code Playgroud)
有没有办法定义一个变量来保存整个列表"(1,2,3,4)"?我该如何定义它?
declare @myList {data type}
set @myList = (1,2,3,4)
select * from myTable where myColumn in @myList
Run Code Online (Sandbox Code Playgroud) SQL Server 2008是否具有类似MySQL的数据类型enum?
试图找到一些简单的SQL Server PIVOT示例.我发现的大多数例子都涉及计算或总结数字.我只想转动一些字符串数据.例如,我有一个返回以下内容的查询.
Action1 VIEW
Action1 EDIT
Action2 VIEW
Action3 VIEW
Action3 EDIT
Run Code Online (Sandbox Code Playgroud)
我想使用PIVOT(如果可能的话)来产生如下结果:
Action1 VIEW EDIT
Action2 VIEW NULL
Action3 VIEW EDIT
Run Code Online (Sandbox Code Playgroud)
PIVOT功能可以实现这一点吗?
我正在查看SQL Server 2008的AdventureWorks示例数据库,我在他们的创建脚本中看到他们倾向于使用以下内容:
ALTER TABLE [Production].[ProductCostHistory] WITH CHECK ADD
CONSTRAINT [FK_ProductCostHistory_Product_ProductID] FOREIGN KEY([ProductID])
REFERENCES [Production].[Product] ([ProductID])
GO
Run Code Online (Sandbox Code Playgroud)
紧接着是:
ALTER TABLE [Production].[ProductCostHistory] CHECK CONSTRAINT
[FK_ProductCostHistory_Product_ProductID]
GO
Run Code Online (Sandbox Code Playgroud)
我看到这个用于外键(如此处),唯一约束和常规CHECK约束; DEFAULT约束使用我更熟悉的常规格式,例如:
ALTER TABLE [Production].[ProductCostHistory] ADD CONSTRAINT
[DF_ProductCostHistory_ModifiedDate] DEFAULT (getdate()) FOR [ModifiedDate]
GO
Run Code Online (Sandbox Code Playgroud)
如果有的话,第一种方式与第二种方式之间有什么区别?
t-sql ×10
sql ×6
sql-server ×6
alter-column ×1
c# ×1
database ×1
mysql ×1
pivot ×1
sorting ×1
types ×1