SQL 不能执行

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了SQL 不能执行相关的知识,希望对你有一定的参考价值。

INSERT INTO Strategies (Name, ShortName, Description, ID)
VALUES ('ww', 'www', 'wwww', 3); SELECT @@IDENTITY AS newID;

报“分析查询时出错。 [ Token line number = 1,Token line offset = 127,Token in error = SELECT ]”

不知道是哪里的问题。
得到新插入数据的"自动增量ID",然后要利用这个ID在另外一张表里插入相关数据。
我在SQL查询器里也可以运行,并获得相应的值,可是用C# 中的SQLCeCommand.ExecuteScalar()执行就会报上面那个错误。

SELECT @@IDENTITY AS 'newID';
newID要加单引号

以下是帮助中的解释

在一条 INSERT、SELECT INTO 或大容量复制语句完成后,@@IDENTITY 中包含此语句产生的最后的标识值。若此语句没有影响任何有标识列的表,则 @@IDENTITY 返回 NULL。若插入了多个行,则会产生多个标识值,@@IDENTITY 返回最后产生的标识值。如果此语句激发一个或多个执行产生标识值的插入操作的触发器,则语句执行后立即调用 @@IDENTITY 将返回由触发器产生的最后的标识值。若 INSERT 或 SELECT INTO 语句失败或大容量复制失败,或事务被回滚,则 @@IDENTITY 值不会还原为以前的设置。

在返回插入到表的 @@IDENTITY 列的最后一个值方面,@@IDENTITY、SCOPE_IDENTITY 和 IDENT_CURRENT 函数类似。

@@IDENTITY 和 SCOPE_IDENTITY 将返回在当前会话的所有表中生成的最后一个标识值。但是,SCOPE_IDENTITY 只在当前作用域内返回值,而 @@IDENTITY 不限于特定的作用域。

IDENT_CURRENT 不受作用域和会话的限制,而受限于指定的表。IDENT_CURRENT 返回任何会话和任何作用域中为特定表生成的标识值。有关更多信息,请参见 IDENT_CURRENT。

示例
下面的示例向带有标识列的表中插入一行,并用 @@IDENTITY 显示在新行中使用的标识值。

INSERT INTO jobs (job_desc,min_lvl,max_lvl)
VALUES ('Accountant',12,125)
SELECT @@IDENTITY AS 'Identity'
参考技术A 我用msSql在中写的语句:
create table Strategies(uid int identity(1,1),Name varchar(8),ShortName varchar(8),Description varchar(8),ID int)

INSERT INTO Strategies (Name, ShortName, Description, ID) VALUES ('ww', 'www', 'wwww', 3)
SELECT @@IDENTITY AS newID

以上是可以运行的,用@@IDENTITY,表中必须包含自动增长列。你再好好检查检查。
参考技术B 关键错误在这里:

SELECT @@IDENTITY AS newID

改为

SELECT @@IDENTITY AS [newID]
参考技术C SELECT @@IDENTITY AS newID;

什么意思。?你想干嘛。?本回答被提问者采纳

pl sql developer应用问题

我在用pl sql developer工作时发现,在sql2000可执行的语句不能执行。如:select left(科目代码,8) 科目代码,sum(借方金额) 借方金额,sum(贷方金额) 贷方金额
from 凭证库
where left(科目代码,1)='4' group by left(科目代码,8)
好象where或select 中不能执行left,但如遇上述问题应如何解决,请高人指点。另外,是不是pl sql中select不能执行计算查询,sql2000可是能的,另外我在pl sql中select * from pz where year(年度)=‘2010’好相也不能执行,提示“ORA-00940:"year":标识符无效”。上面不能执行时也提示“ORA-00940:"left":标识符无效”.

有些语言是通用的,而有些函数或者形式是某个数据库独有的。
YEAR()就是一个,这个是SQLSERVER的函数,在ORACLE下是不支持的。要换成ORACLE的函数。TO_CHAR(年度,'YYYY') = '2010'这样来转。
ORACLE都是使用TO_CHAR(日期,'格式')来获取日期类型具体的值的。
而LEFT,也不是ORACLE支持的函数,换成SUBSTR(字符串或字段,起始位置,截取长度)这个来完成。
select substr(科目代码,1,8) 科目代码,sum(借方金额) 借方金额,sum(贷方金额) 贷方金额
from 凭证库
where substr(科目代码,1,1)='4' group by substr(科目代码,1,8)

查询当前日期的月份等
select to_char(sysdate,'yyyy'), to_char(sysdate,'mm'), to_char(sysdate,'dd') from dual追问

你的回答非常清楚,深表感谢。但我在使用时系统仍提示“ORA-00904:"SUBSRT":标识符无效”。这是我使用的具体内容
select substr(功能分类代码,1,5) 功能分类代码,sum(借) 借方金额,sum(贷) 贷方金额
from pz
where subsrt(科目代码,1,3)='501'
group by substr(功能分类代码,1,5)
另外,如这样的命令where subsrt(科目代码,1,3)='501'and 摘要 not like '%转结余%',该如何解决

追答

“ORA-00904:"SUBSRT":
您好,您写错了函数名。正确的名字是SUBSTR,所以会提示错误。
where substr(科目代码,1,3)='501'and 摘要 not like '%转结余%'
这个语句是支持的,没问题,直接在WHERE条件里面写就好了。

参考技术A left(科目代码,1) 是SQL server独有的语法,在oracle中需要换成 substr(科目代码,1,1) 参考技术B oracle 语法 与 MSSQL的 语法有很多不一样的 参考技术C 连接数据库驱动包~~~!和数据库打交道的桥
追问

连接数据库驱动包如何连接,请指教

以上是关于SQL 不能执行的主要内容,如果未能解决你的问题,请参考以下文章

为啥我们不能在 SQL Server 中的函数内执行存储过程

sql2019建完表不能执行

SQL:当你不能使用 PARTITION 列时如何执行聚合?

sqlyog里面能不能同时执行多条mysql 的sql语句

SQL 2005 存储过程结果集的 ODBC 执行/获取不能使用表 @variable

SQL中where后不能跟聚合函数