在存储过程中使用动态sql的CASE语句
我试图通过将动态SQL存储在存储过程中的变量中来构建CASE-WHEN语句,但我得到了以下错误。有人能分享一下你对如何解决这个错误的想法吗。多谢各位 --代码在存储过程中使用动态sql的CASE语句,sql,sql-server,stored-procedures,sql-server-2012,sql-server-2016,Sql,Sql Server,Stored Procedures,Sql Server 2012,Sql Server 2016,我试图通过将动态SQL存储在存储过程中的变量中来构建CASE-WHEN语句,但我得到了以下错误。有人能分享一下你对如何解决这个错误的想法吗。多谢各位 --代码 SELECT CASE WHEN ResultTableName LIKE '%Loss_ByEvent]' THEN @SQLStmt = N'CREATE TABLE dbo.' + ResultTableName + N
SELECT
CASE WHEN ResultTableName LIKE '%Loss_ByEvent]'
THEN @SQLStmt =
N'CREATE TABLE dbo.' + ResultTableName + N' (
' + CreateStmt + N'
) ON Loss_ByAnalysis(SliceID)'
WHEN ResultTableName LIKE '%Loss_ByGeo]'
THEN @SQLStmt =
N'CREATE TABLE dbo.' + ResultTableName + N' (
' + CreateStmt + N'
) ON Loss_ByAnalysis(SliceID)'
ELSE
@SQLStmt =
N'CREATE TABLE dbo.' + ResultTableName + N' (
' + CreateStmt + N'
)'
END
,@DBName = DBName
,@ResultTableName = ResultTableName
FROM #CreateResult_ResultTables lr
WHERE ID = @ResultTableCount;
--错误:-
Msg 102, Level 15, State 1, Procedure Procedure_name, Line 141 [Batch Start Line 7]
Incorrect syntax near '='.
由于CASE是SQL中的一个函数,所以出现了一个错误,但您使用它的方式就像使用语句或列表单一样
SELECT
@SQLStmt =
CASE WHEN ResultTableName LIKE '%Loss_ByEvent]'
THEN N'CREATE TABLE dbo.' + ResultTableName + N' (
' + CreateStmt + N'
) ON Loss_ByAnalysis(SliceID)'
WHEN ResultTableName LIKE '%Loss_ByGeo]'
THEN N'CREATE TABLE dbo.' + ResultTableName + N' (
' + CreateStmt + N'
) ON Loss_ByAnalysis(SliceID)'
ELSE
N'CREATE TABLE dbo.' + ResultTableName + N' (
' + CreateStmt + N'
)'
END
,@DBName = DBName
,@ResultTableName = ResultTableName
FROM #CreateResult_ResultTables lr
WHERE ID = @ResultTableCount;
而且@SeanLange是正确的,这很容易受到SQL注入的攻击。您会收到一个错误,因为CASE是SQL中的一个函数,但您使用它时就像使用语句或列表单一样
SELECT
@SQLStmt =
CASE WHEN ResultTableName LIKE '%Loss_ByEvent]'
THEN N'CREATE TABLE dbo.' + ResultTableName + N' (
' + CreateStmt + N'
) ON Loss_ByAnalysis(SliceID)'
WHEN ResultTableName LIKE '%Loss_ByGeo]'
THEN N'CREATE TABLE dbo.' + ResultTableName + N' (
' + CreateStmt + N'
) ON Loss_ByAnalysis(SliceID)'
ELSE
N'CREATE TABLE dbo.' + ResultTableName + N' (
' + CreateStmt + N'
)'
END
,@DBName = DBName
,@ResultTableName = ResultTableName
FROM #CreateResult_ResultTables lr
WHERE ID = @ResultTableCount;
@SeanLange是正确的,它非常容易受到SQL注入的攻击。您尝试过这种方法吗
SELECT
CASE WHEN ResultTableName LIKE '%Loss_ByEvent]'
THEN 'CREATE TABLE dbo.' + ResultTableName + N' (
' + CreateStmt + N'
) ON Loss_ByAnalysis(SliceID)'
WHEN ResultTableName LIKE '%Loss_ByGeo]'
THEN
N'CREATE TABLE dbo.' + ResultTableName + N' (
' + CreateStmt + N'
) ON Loss_ByAnalysis(SliceID)'
ELSE
N'CREATE TABLE dbo.' + ResultTableName + N' (
' + CreateStmt + N'
)'
END AS Sqlstmt
,@DBName = DBName
,@ResultTableName = ResultTableName
FROM #CreateResult_ResultTables lr
WHERE ID = @ResultTableCount;
你试过这种方法吗
SELECT
CASE WHEN ResultTableName LIKE '%Loss_ByEvent]'
THEN 'CREATE TABLE dbo.' + ResultTableName + N' (
' + CreateStmt + N'
) ON Loss_ByAnalysis(SliceID)'
WHEN ResultTableName LIKE '%Loss_ByGeo]'
THEN
N'CREATE TABLE dbo.' + ResultTableName + N' (
' + CreateStmt + N'
) ON Loss_ByAnalysis(SliceID)'
ELSE
N'CREATE TABLE dbo.' + ResultTableName + N' (
' + CreateStmt + N'
)'
END AS Sqlstmt
,@DBName = DBName
,@ResultTableName = ResultTableName
FROM #CreateResult_ResultTables lr
WHERE ID = @ResultTableCount;
为什么需要存储过程来创建表?这对我来说非常可怕,很可能容易受到sql注入的攻击。应用程序中存在一个现有的存储过程。。。在while循环中,它遍历表名列表并创建表。但我想为两个表名使用分区来创建表。
然后
接受表达式,而不是语句,以及大小写的结果。。。END本身就是一个表达式<代码>选择@SQLStmt=CASE当。。。然后,其他的。。。END
@Jeoren您能帮我重新编写代码吗…为什么需要存储过程来创建表?这对我来说非常可怕,很可能容易受到sql注入的攻击。应用程序中存在一个现有的存储过程。。。在while循环中,它遍历表名列表并创建表。但我想为两个表名使用分区来创建表。然后
接受表达式,而不是语句,以及大小写的结果。。。END本身就是一个表达式<代码>选择@SQLStmt=CASE当。。。然后,其他的。。。结束
@Jeoren你能帮我重新编写代码吗…它在Arryyoung工作得很好。。。非常感谢……:)它很好地工作了很久。。。非常感谢……:)