0

我有一个像这样的存储过程,如果它不存在,它基本上会在字段中附加一个前缀:

ALTER PROCEDURE [dbo].[AgSp_UpdateAgTbl_Licensing ](@newPrefix nvarchar, @systemName nvarchar)

AS
BEGIN
       -- SET NOCOUNT ON added to prevent extra result sets from
       -- interfering with SELECT statements.
       SET NOCOUNT ON;

update AgTbl_Licensing
set   UrlPrefixes =
           case
               when UrlPrefixes is null or UrlPrefixes = ''
               then @newPrefix
               else convert ( nvarchar( max ), UrlPrefixes) + ', '+@newPrefix
            end
where SystemName = @systemName and (UrlPrefixes not like ('%'+@newPrefix+'%') or UrlPrefixes is null)

END

我试着这样称呼它:

Execute AgSp_UpdateAgTbl_Licensing 'eb_', 'EB1';

但是没有对数据库进行更新 - 怎么会?我无法调试,因为我没有系统管理员

4

2 回答 2

1

我认为你应该声明长度为的过程参数;

@newPrefix nvarchar(50), @systemName nvarchar(50)

否则,它只需要FIRST character您的字符串,因此您WHERE clause fails可以找到要更新的记录。而且您的参数也不是您期望的。

于 2013-01-31T11:45:34.817 回答
1

(忽略将多个值存储在单个列中几乎总是比将它们正确存储为表中的行更糟糕)

您已经为您的过程声明了两个参数,长度均为 1。尝试:

ALTER PROCEDURE [dbo].[AgTbl_Licensing](@newPrefix nvarchar(100), @systemName nvarchar(100))

nchar 和 nvarchar

当在数据定义或变量声明语句中未指定 n 时,默认长度为 1。当未使用 CAST 函数指定 n 时,默认长度为 30。

于 2013-01-31T11:46:20.723 回答