Hi,
I have been trying to write a SP where, in the result set is brought back, two ntext columns are combined with a text string, However I get an error when I click on apply;
"Error 403: Invalid operator for data type. Operator equals add, type equals ntext"
I can only assume that this means you can't add (or even manipulate) ntext columns in a SP.
Short of changing the sp to bring back 3 columns and to do the manipulation in my c# code I can't think of a way round this.
Anyone with any ideas?
thanks in advance
rich
SP code ( I have highlighted the problem area):
CREATE PROCEDURE [dbo].[usp_RCTReportQuery]
@.PersonType varchar(255),
@.Status varchar(255),
@.Oustanding varchar(255)
AS
DECLARE @.PersonTypeID int,
@.StatusID int,
@.OustandingID int
SELECT @.PersonTypeID = PersonTypeID FROM TBL_LU_People_Type WHERE PersonType = @.PersonType
SELECT @.StatusID = MemoTypeID FROM TBL_LU_Memo WHERE MemoType = @.Status
SELECT @.OustandingID = MemoTypeID FROM TBL_LU_Memo WHERE MemoType = @.Oustanding
SELECT surname as [Potential Claimant], s.thevalue + '<BR /><BR />' + o.thevalue as [Status]
FROM tbl_people p
INNER JOIN tbl_Lu_people lup on lup.personid = p.personid and persontypeid = @.PersonTypeID
LEFT JOIN tbl_memo s on s.caseID = p.caseID and s.memotypeid = @.StatusID
LEFT JOIN tbl_memo o on o.caseID = p.caseID and o.memotypeid = @.OustandingID
GO
Richie:
If you are running SQL Server 2005 you might be able to leverage a function to work around this issue. Perhaps a function like this:
alter function dbo.appendText
( @.prm_textIn nvarchar(max),
@.prm_appendString varchar (8000)
)
returns nvarchar (max)
asbegin
return ( @.prm_textIn + @.prm_appendString )
end
This is coded as a scalar function; you might be better off setting it up as an inline function so that you can potentially leverage it in the future with the CROSS JOIN operator for other purposes. Below is an example:
|||if you are on 2005, you could just use a nvarchar(MAX) column instead of ntext.declare @.what nvarchar (max) set @.what = ''
declare @.firstPart varchar (40) set @.firstPart = ' ** This is'
declare @.secondPart varchar (40) set @.secondPart = ' a test. **'select @.what = @.what + ' #' + convert (nvarchar(5), iter)
from small_iterator (nolock)select len (@.what) as [len],
substring (dbo.appendText (@.what, @.firstPart + @.secondPart), len(@.what) - 6, 30)
as [righthand piece]-- Sample Output: --
-- len righthand piece
-- -- --
-- 218263 #32767 ** This is a test.Dave
www.elsasoft.org|||
Richie:
You might be able to get your query to work in SQL 2005 doing something like this:
|||SELECT surname as [Potential Claimant], cast (s.thevalue as nvarchar (max)) + '<BR /><BR />' + o.thevalue as [Status]
Please specify the version of SQL Server in your posts so it is easy to suggest the correct solution.
1. If you are using SQL Server 2005 then use varchar(max), nvarchar(max), and varbinary(max). The text, ntext, and image data types have been deprecated. The newer max data types will allow you to manipulate the values on the server-side just like regular varchar, nvarchar or varbinary values. Also, for backward compatibility reasons any expression that involves string concatenation will return only a string of maximum length 8000 bytes. In order to concatenate larger length strings you have to cast at least one of the values to varchar(max) or nvarchar(max). So in your SELECT list, you could do something like CAST(s.thevalue as varchar(max)) + '<BR/><BR>' + o.thevalue.
2. If you are not using SQL Server 2005 then there is no way to concatenate strings larger than 8000 bytes. You have to either dump the rows into a temporary table and use UPDATETEXT to manipulate each row individually or simply return the values as multiple columns and concatenate on the client-side
Lastly, you should actually leave the presentation to the client side and do these type of operations on the server. What if you want to later introduce a paragraph break or ident the line? What if the formatting is more complex? You should just return the strings as is to the client and then format it there.
|||Cheers for the tip. Unfortunately I am still using Sql Server 2000 :(
I tried creating a function but you can't have variables of type ntext in functions.
Is there anyway I can do this in SQL Server 2000?
|||I am using sql server 2000 and try using table temp.Whats wrong?
ROBUST PLAN. Somebody help?
se puede crear una fila de tabla de trabajo más larga que el máximo
admitido. Vuelva a enviar la consulta con la sugerencia ROBUST PLAN.
TRANSLATION
Quote:
Originally Posted by
A
row of table of work cannot be created longer than the admitted
maximum. Return to send the consultation with suggestion ROBUST PLAN.
CREATE TABLE temp
(
Proc_id INT,
Proc_Name SYSNAME,
Definition NTEXT
)
-- get the names of the procedures that meet our criteria
INSERT temp(Proc_id, Proc_Name)
SELECT id, OBJECT_NAME(id)
FROM syscomments
WHERE OBJECTPROPERTY(id, 'IsProcedure') = 1
GROUP BY id, OBJECT_NAME(id)
HAVING COUNT(*) > 1
--Inicializar the NTEXT column
UPDATE temp SET Definition=''
CODE --
DECLARE
@.txtPval binary(16),
@.txtPidx INT,
@.curName SYSNAME,
@.curtext NVARCHAR(4000)
--
--
DECLARE C CURSOR
LOCAL FORWARD_ONLY STATIC READ_ONLY FOR
SELECT OBJECT_NAME(id), text
FROM syscomments s
INNER JOIN #MYTEMP t
ON s.id = t.Proc_id
ORDER BY id, colid
OPEN c -> HERE TELL ME ERROR about robust plan.
FETCH NEXT FROM c INTO @.curname, @.curtext
--Start Loop
WHILE (@.@.FETCH_STATUS = 0 )
BEGIN
--get pointer for the current procedure name colid
SELECT @.txtPval = TEXTPTR(Definition)
FROM temp
WHERE Proc_Name = @.curname
--find out where to append the @.temp table′s value
SELECT @.txtPidx = DATALENGTH(Definition)/2
FROM temp
WHERE Proc_Name = @.curName
--Apply the append of the current 8kb chunk
UPDATETEXT temp.definition @.txtPval @.txtPidx 0 @.curtext
FETCH NEXT FROM c INTO @.curName, @.curtext
END
-- check what was produced
SELECT Proc_name, Definition, DATALENGTH(Definition)/2
FROM temp
-- check our filter
SELECT Proc_Name, Definition
FROM temp
WHERE definition LIKE '%foobar%'
--Clean up
DROP TABLE temp
CLOSE c
DEALLOCATE c
Thanks for try help.
No comments:
Post a Comment