我在MS SQL Server中遇到错误。 我正在创建一个存储过程,我在其中声明一个值,我将其设置为select语句,然后执行它。然后我想在稍后的同一个存储过程中使用它,但它仍然将它视为一个select语句,而不是语句的结果。
声明:
let managedObjectModel = NSManagedObjectModel.init(contentsOfURL: modelURL)
var managedObjectContext = NSManagedObjectContext.init(concurrencyType: .MainQueueConcurrencyType)
managedObjectContext.persistentStoreCoordinator = NSPersistentStoreCoordinator.init(managedObjectModel: managedObjectModel)
var error: NSError?
let options = [NSMigratePersistentStoresAutomaticallyOption : true, NSInferMappingModelAutomaticallyOption : true];
let persistentStore = try! managedObjectContext.persistentStoreCoordinator?.addPersistentStoreWithType(NSInMemoryStoreType, configuration: nil, URL: nil, options: options)
之后进行比较(不起作用):
Declare @functie varchar(255);
Set @functie = 'Select Functie From Medewerker m, Logins l where m.mdwnr = l.mdwnr And gebruikersnaam = ''' + @GebruikersNaam + ''''
EXECUTE(@functie)
Print @functie
打印用于调试,不是必需的。
我该如何解决这个问题?
答案 0 :(得分:3)
你根本不需要动态sql。以下是设置变量值的查询。
Declare @functie varchar(255);
Select @functie = Functie
From Medewerker m
join Logins l on m.mdwnr = l.mdwnr
And gebruikersnaam = @GebruikersNaam
此外,你应该养成使用ANSI-92样式连接的习惯,而不是使用逗号分隔的表格列表。 "更新"加入语法现已近30岁。
答案 1 :(得分:0)
您只能从EXEC获取数据到表格,然后您可以根据您的要求解析该信息。这是可能的例子:
DECLARE @sql nvarchar(255) = 'Select ''test'''
DECLARE @result TABLE (functie nvarchar(100))
DECLARE @functie nvarchar(100)
INSERT INTO @result EXECUTE(@sql)
SET @functie = (SELECT TOP(1) functie FROM @result)
PRINT(@functie)
然而,之前的评论是完美的,您不需要动态SQL来执行此操作,并且参数化查询可以在SQL注入的情况下保存您的屁股(在您的代码中看起来可能)。
答案 2 :(得分:0)
先前的答案我解决了你的问题 - 我还要注意你的比较代码是不正确的 - 连续使用两个单引号字符解析为一个单引号字符(而不是被视为文本分隔符)。
如果您在结果中获得单引号,那么该代码应如下所示:
If '' + @functie + '' = '''Administrator'''
Print @functie