'CREATE VIEW'必须是查询批处理中的第一个语句
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了'CREATE VIEW'必须是查询批处理中的第一个语句相关的知识,希望对你有一定的参考价值。
基本上它的标题是什么。这是我的代码。
USE Assignment2;
GO
/* Player View (2 marks)
Create a view which shows the following details of all players:
• The ID number of the player
• The first name and surname of the player concatenated and given an alias of “full_name”
• The team ID number of the player (if applicable)
• The team name of the player (if applicable)
• The coach ID number of the player (if applicable)
• The name of the player’s coach (if applicable)
Creating this view requires a select statement using multiple joins and concatenation of names.
Make sure that you use the appropriate type of join to ensure that players without teams or coaches are still included in the results.
*/
-- Write your Player View here
PRINT 'Creating Player View'
CREATE VIEW playerView AS
SELECT player.id, player.firstName + ' ' + player.surname AS 'Full name', player.team, team.name, player.coach, coach.firstName, coach.surname
FROM player
LEFT OUTER JOIN team
ON player.team = team.id
LEFT OUTER JOIN player as coach
ON player.coach = coach.id;
GO
/* Race View (3 marks)
Create a view which shows the following details of all races:
• All of the columns in the race table
• The name of the race type, course and team involved in the race
• The full name of the player observing the race and the full name of the MVP (if applicable)
• A calculated column with an alias of “unpenalised_score”, which adds the points penalised to the final score
Creating this view requires a select statement using multiple joins and concatenation of names.
Make sure that you use the appropriate type of join to ensure that races without MVPs are still included in the results.
*/
-- Write your Race View here
PRINT 'Creating Race View'
CREATE VIEW raceView AS
SELECT race.id, race.dateOfRace, race.raceType, raceType.name AS raceTypeName, race.course, course.name AS courseName, race.team, team.name AS teamName, race.observer, obs.firstName + ' ' + obs.surname AS observer_name, race.mvp, mvp.firstName + ' ' + mvp.surname AS mvp_name, race.pointsPenalised, race.finalScore + race.pointsPenalised AS unpenalised_score, race.finalScore
FROM race
INNER JOIN raceType
ON race.raceType = raceType.id
INNER JOIN course
ON race.course = course.id
INNER JOIN team
ON race.team = team.id
LEFT OUTER JOIN player AS mvp
ON race.mvp = mvp.id
LEFT OUTER JOIN player AS obs
ON race.observer = obs.id;
GO
SELECT *
FROM playerView
SELECT *
FROM raceView
/* Additional Information:
The views are very convenient replacements for the tables they represent, as they include the names and calculated values that you will often need in queries.
You are very much encouraged to use the views to simplify the queries that follow. You can use a view in a SELECT statement in exactly the same way as you can use a table.
If you wish to create additional views to simplify the queries which follow, include them in this file.
*/
当我分别运行每个CREATE VIEW
时,似乎正确运行它没有错误。但是当我尝试运行整个脚本时,它给了我这个错误。
Msg 111,Level 15,State 1,Line 20 'CREATE VIEW'必须是查询批处理中的第一个语句。 Msg 111,Level 15,State 1,Line 15 'CREATE VIEW'必须是查询批处理中的第一个语句。 Msg 208,Level 16,State 1,Line 2 无效的对象名称'playerView'。
在尝试运行此脚本之前,我首先删除数据库,重新创建表,填充它们然后运行此脚本。
我出错的任何想法?
把GO
放在PRINT 'Creating Player View'
之后它应该工作:
PRINT 'Creating Player View'
GO
CREATE VIEW playerView AS
批处理由GO
这个词分隔 - 这是对客户端工具的指令,而不是SQL Server的指令,特别是告诉这些工具如何将查询拆分成批处理。
该错误告诉您CREATE VIEW
必须是批处理中的第一个语句:
USE Assignment2;
GO
/* Player View (2 marks)
Create a view which shows the following details of all players:
• The ID number of the player
• The first name and surname of the player concatenated and given an alias of “full_name”
• The team ID number of the player (if applicable)
• The team name of the player (if applicable)
• The coach ID number of the player (if applicable)
• The name of the player’s coach (if applicable)
Creating this view requires a select statement using multiple joins and concatenation of names.
Make sure that you use the appropriate type of join to ensure that players without teams or coaches are still included in the results.
*/
-- Write your Player View here
PRINT 'Creating Player View'
GO -->-- New GO here
CREATE VIEW playerView AS
所以我在GO
之前添加了一个CREATE VIEW
将CREATE VIEW代码放在EXECUTE中
SOME CONDITION..
EXECUTE('CREATE VIEW vwName...')
这通常是因为能够创建VIEW或任何DBO,您需要将整个脚本放在TRANSACTION中,或者需要打开SET QUOTED_IDENTIFIER。
即
USE [yourdatabase]
GO
SET NUMERIC_ROUNDABORT, IMPLICIT_TRANSACTIONS OFF
SET ANSI_PADDING, ANSI_NULLS, QUOTED_IDENTIFIER, ANSI_WARNINGS, CONCAT_NULL_YIELDS_NULL, ARITHABORT, XACT_ABORT ON
SET TRANSACTION ISOLATION LEVEL SERIALIZABLE
GO
BEGIN TRANSACTION
GO
SET ANSI_NULLS ON
SET QUOTED_IDENTIFIER ON
...
...
-- Write your Race View here
PRINT 'Creating Race View'
GO
CREATE VIEW raceView AS
SELECT race.id, race.dateOfRace, race.raceType, raceType.name AS raceTypeName, race.course, course.name AS courseName, race.team, team.name AS teamName, race.observer, obs.firstName + ' ' + obs.surname AS observer_name, race.mvp, mvp.firstName + ' ' + mvp.surname AS mvp_name, race.pointsPenalised, race.finalScore + race.pointsPenalised AS unpenalised_score, race.finalScore
FROM race
INNER JOIN raceType
ON race.raceType = raceType.id
INNER JOIN course
ON race.course = course.id
INNER JOIN team
ON race.team = team.id
LEFT OUTER JOIN player AS mvp
ON race.mvp = mvp.id
LEFT OUTER JOIN player AS obs
ON race.observer = obs.id;
GO
IF @@ERROR <> 0 BEGIN IF @@TRANCOUNT > 0 ROLLBACK SET NOEXEC ON END
GO
IF @@TRANCOUNT>0 COMMIT TRANSACTION
GO
SET NOEXEC OFF
如果尝试从Entity Framework迁移执行脚本,您可能还会遇到此问题。我认为这是由于EF在事务中运行这些脚本(如此问题的另一个答案中所述)。你可以用这种语法来解决这个问题:
IF NOT EXISTS (SELECT * FROM sys.views WHERE object_id = OBJECT_ID(N'[dbo].[V_MovieActors]'))
EXEC dbo.sp_executesql @statement = N'CREATE VIEW [dbo].[V_MovieActors]
AS
SELECT NEWID() AS Id, dbo.Movie.Title, dbo.Movie.ReleaseDate, dbo.Actor.FirstName + '' '' + dbo.Actor.LastName AS Actor, dbo.Actor.DateOfBirth
FROM dbo.Actor INNER JOIN
dbo.Movie ON dbo.Actor.Id = dbo.Movie.Actor_Id
'
这将整个事情转变为SQL执行的单个命令。这种方法来自这篇非常有用的文章Using SQL Views With Entity Framework Code First by Morgan Kamoga。
以上是关于'CREATE VIEW'必须是查询批处理中的第一个语句的主要内容,如果未能解决你的问题,请参考以下文章
我建立的sql列表出现'CREATE VIEW' 必须是查询批次中的第一个语句。
sql 建立视图中 一直遇到Create view必须是批处理中仅有的语句报错
SQL 日期函数问题;我想写一个查询语句,是查表中日期字段后十天的数据
Minecraft出错: Can't create cache file!
Mysql错误问题:ERROR 1005 (HY000): Can't create table 'crm_1.tbl_client' (errno: 150)
'No application found. Either work inside a view function or push'