【发布时间】:2020-05-07 22:31:17
【问题描述】:
ALTER PROCEDURE [dbo].[Create_Subjects]
@Subj_ID nvarchar(9)
AS
DECLARE @First3Digits nvarchar(3);
DECLARE @Result int;
DECLARE @Sql nvarchar(max)
-- Fetching the fiest 3 digits of the subject
SET @First3Digits = SUBSTRING(@Subj_ID,1,3);
-- Check if view is present or not
IF EXISTS (SELECT 1 FROM sys.views WHERE Name = @First3Digits)
BEGIN
SET @Sql = 'select @Result = case when exists (select 1 from dbo.' + quotename(@First3Digits) + ' where SubjectName = ''' + @Subj_ID + ''') then 1 else 0 end';
EXECUTE sp_executesql @Sql, N'@Subj_ID nvarchar(9), @Result bit out', @Subj_ID = @Subj_ID, @Result = @Result out;
-- checking if the subject is present in the view
END
ELSE
BEGIN
-- Create a view as view doesn't exist
SET @Sql = 'create view ' + @First3Digits
+ ' as
(select SubjectName from dbo.Subjects where SubjectName like '+@First3Digits+'%'+');';
EXECUTE sp_executesql @Sql, N'@First3Digits nvarchar(3)', @First3Digits= @First3Digits;
SET @Result = 0;
END
RETURN @Result
GO
这是执行存储过程的代码:
EXEC [dbo].[Create_Subjects] '1234567890'
遇到错误:
消息 156,第 15 级,状态 1,第 28 行
关键字“view”附近的语法不正确消息 102,第 15 级,状态 1,第 29 行
')' 附近的语法不正确
【问题讨论】:
-
这是create view语句的语法
-
Msg 156, Level 15, State 1, Line 28 关键字“view”附近的语法不正确。消息 102,级别 15,状态 1,第 29 行 '%' 附近的语法不正确。
-
如果您的视图名称不符合常规标识符命名规则(例如,它以数字开头),您还必须将名称用双引号或方括号括起来。使用
QUOTENAME就像你之前在 proc 中所做的那样:SET @Sql = 'create view ' + QUOTENAME(@First3Digits) -
当您在创建视图中添加 @First3Digits 时,您也缺少撇号。您在 SELECT 块中正确执行了此操作,但在 CREATE VIEW 块中未正确执行。
-
不要为每个参数创建一个视图,而是查看内联表值函数
标签: sql-server tsql dynamic-sql