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行 关键字 "视图 "附近的语法不正确。
问题 102,第 15 层,状态 1,第 29 行 ')' 附近的语法不正确。
你的SQL有很多问题。但首先调试它们的方法是打印SQL而不执行它,那么它的正常SQL,你可以很容易地识别它的问题所在。
quotename
再次按照注释中的建议。@First3Digits
变成 sp_executesql
因为这时你已经使用了它的值--鉴于你正在创建一个视图,你必须这样做。 set @Sql = 'create view dbo.' + quotename(@First3Digits)
+ ' as'
+ ' select SubjectName'
+ ' from dbo.Subjects'
+ ' where SubjectName like ''' + @First3Digits + ''' + ''%'';';
-- This is how you debug dynamic SQL
print(@Sql);
execute sp_executesql @Sql;
注意:正如我在你之前的问题中提到的,根据提供的信息,这似乎是一个非常糟糕的设计。几乎可以肯定有更好的方法来解决你的大局问题。正如Martin Smith所评论的那样 内联表值函数 可能值得调查。