SELECT CONTAINS is limited to 4000 characters

  • In c# I use a function that generates Sql code that is executed through the SqlCommand.ExecuteReader command and that contains the ContainsTable command whose parameter "contains_search_condition" has more than 4000 characters.Generates Error: -2146232060 {"The character string beginning with '( code | collection 'is too long. The maximum length is 4000. "} This query retrieves the synonyms and inflections of each word that the user enters and, depending on the fields on the screen, all the words may be OR or AND. Also it may be that the Sql code has other commands added. I also use RANK. You have to think that only the synonyms and inflections of a word can already exceed 4000 characters. I cannot use FORMSOF because it retrieves synonyms from an xml file and that causes various problems and limitations, so I had to rule it out. 1.- How can I overcome the 4000 character limitation? 2.- Can I see the source code of CONTAINSTABLE and FreeTextTable? 3.- Can I make my own command to read from the database and overcome this limitation?

    USE [Esp Derecho, BOE]
    GO

    SELECT [Libro_BOE - Código de Derecho Agroalimentario (Contexto Sectorial de la Industria Agroalimentaria)].*, FT.*
    FROM [Libro_BOE - Código de Derecho Agroalimentario (Contexto Sectorial de la Industria Agroalimentaria)] INNER JOIN
    CONTAINSTABLE([Libro_BOE - Código de Derecho Agroalimentario (Contexto Sectorial de la Industria Agroalimentaria)], [Contenido],
    '(codigo|recopilación|compilación|reglamento|reglamentación|regla|norma|sistematización|sistema|metodización|método|ley|disciplina|mandamiento|pandectas|providencia|legislación|constitución|norma|ley|\"código civil\"|\"código penal\"|\"código de señales\"|codigo|recopilación|compilación|reglamento|reglamentación|regla|norma|sistematización|sistema|metodización|método|ley|disciplina|mandamiento|pandectas|providencia|legislación|constitución|norma|ley|\"código civil\"|\"código penal\"|\"código de señales\")
    AND
    (casa|edificio|residencia|mansión|vivienda|hogar|domicilio|señas|dirección|habitación|piso|apartamiento|paradero|cuarto|techo|cubierto|fuego|lares|aposento|rincón|paraje|humos|construcción|apeadero|nido|cubil|manida|garito|caverna|chamizo|chiscón|choza|casucha|barracón|tugurio|madriguera|agujero|zahurda|chirlata|antro|tabernáculo|jaula|palomar|gallinero|conejera|gusanera|pocilga|picadero|aprisco|redil|cueva|cuartucho|chiribitil|zaquizamí|mechinal|socucho|cuchitril|tabuco|caramanchel|garigolo|tapera|chambucho|pastoforio|celda|palacio|palazuelo|pazo|villa|hotel|quinta|quintana|casaquinta|castillo|casal|museo|casón|casona|caserón|casaron|casilla|casuca|hocino|cigarral|carmen|carme|hormazo|cortijo|torre|bohío|masía|masería|caserío|rafal|rafalla|villoría|granja|alquería|chacra|chácara|quintería|estancia|cortijada|cobertizo|establo|corral|corrala|casa-cuna|asilo|hospital|manicomio|hospicio|inclusa|pensión|figón|fonda|hostal|hospedería|albergue|hostería|posada|mesón|parador|venta|ventorro|ventorrillo|cantina|aguaducho|lupanar|mancebía|burdel|ayuntamiento|consistorio|diputación|ministerio|comisaría|oficina|centro|casino|círculo|club|colegio|internado|biblioteca|exposición|teatro|cinematógrafo|circo|anfiteatro|frontón|hipódromo|velódromo|ateneo|taberna|café|cafetería|bar|balneario|prisión|cárcel|penal|presidio|catedral|colegiata|iglesia|santuario|basílica|templo|oratorio|humilladero|ermita|convento|monasterio|seminario|cartuja|planta|portal|portería|conserjería|vestíbulo|garitón|cochera|escalera|caja|ascensor|patio|corredor|sótano|subterráneo|accesorias|bajo|bajos|entresuelo|entresuelejo|principal|altos|ático|guardilla|sotabanco|buharda|desván|azotea|terraza|tejado|chimenea|jardín|parque|pabellón|estufa|invernadero|presencia|convivencia|vecindad|conventualidad|habitabilidad|cohabitación|arrendamiento|barriada|barrio|circunscripción|departamento|manzana|cuadra|isla|acera|casero|dueño|propietario|arrendatario|inquilino|habitante|habitador|residente|morador|conviviente|camarada|vecino|portero|conserje|doméstico|hogareño|cívico|domiciliario|urbano|exterior|interior|abuhardillado|aguardillado|habitable|vividero|familia|linaje|prosapia|estirpe|casta|progenie|solar|cepa|blasón|empresa|sociedad|firma|asociación|compañía|consorcio|corporación|entidad|agrupación|grupo|comercio|edificio|vivienda|domicilio|habitación|techo|casilla|oficina|colegio|teatro|escalera|sótano|tejado|arrendamiento|vecino|familia|empresa|arquitectura|\"casa solar\"|\"casa solariega\"|\"finca agrícola\"|\"casa consistorial\"|\"gobierno civil\"|\"estadio deportivo\"|\"palacio episcopal\"|\"planta baja\"|\"cuarto principal\"|\"razón social\"|\"casa de campo\"|\"casa de labor\"|\"casa de labranza\"|\"casa de vecindad\"|\"corral de vecindad\"|\"casa de recogimiento\"|\"casa de maternidad\"|\"casa de beneficencia\"|\"casa de locos\"|\"casa de salud\"|\"casa de expósitos\"|\"casa de huéspedes\"|\"casa de comidas\"|\"casa de viajeros\"|\"casa de lenocinio\"|\"casa a la malicia\"|\"casa de prostitución\"|\"casa de trato\"|\"casa de tapado\"|\"casa de préstamos\"|\"casa de juego\"|\"casa de baños\"|\"casa de la moneda\"|\"sala de conferencias\"|\"plaza de toros\"|\"casa de corrección\"|\"casa de canónigos\"|\"casa de oración\"|\"quedarse de asiento\"|\"estar de asiento\"|\"tener casa abierta\"|\"franquear a uno la casa\"|\"levantar la casa\"|\"caerse la casa encima\"|\"echar la casa por la ventana\"|\"deshacerse una casa\"|\"estar de casa\"|\"no parar en casa\"|\"ser uno muy de casa\"|casas|casa|casaron|casasteis|caso|casaste|case|casen|caseis|casemos|caseos|cases|case|casan|casais|casamos|caso|casando|casado|casada|casados|casadas|casaran|casarais|casaramos|casaras|casara|casasen|casaseis|casasemos|casases|casase|casaban|casabais|casabamos|casabas|casaba|casaran|casareis|casaremos|casara|casaras|casare|casaren|casareis|casaremos|casares|casare|casarian|casariais|casariamos|casarias|casaria|casad|casad|casar)')
    FT ON Id=FT.[Key] WHERE (ESTADO IS NULL OR ESTADO = ' ') ORDER BY RANK, Pagina, Parrafo, Linea, Palabra

    An example of a ContainsTable using the FORMSOF(THESAURUS / INFLECTIONAL) command :

    SELECT [Libro_BOE - Código de Derecho Agroalimentario (Contexto Sectorial de la Industria Agroalimentaria)]., FT.FROM [Libro_BOE - Código de Derecho Agroalimentario (Contexto Sectorial de la Industria Agroalimentaria)]INNER JOIN CONTAINSTABLE([Libro_BOE - Código de Derecho Agroalimentario (Contexto Sectorial de la Industria Agroalimentaria)], [Contenido], '((FORMSOF(INFLECTIONAL, codigo) ANDFORMSOF(INFLECTIONAL, casa)) OR (FORMSOF(THESAURUS, codigo) AND FORMSOF(THESAURUS, casa)))') FTON Id=FT.[Key] ORDER BY RANK DESC, Pagina, Parrafo, Linea, Palabra
  • SQL Server is not open source, so you won't be able to get at the source code. That's a hard limit set by the use of the NVARCHAR data type. The documentation for CONTAINSTABLE points you to CONTAINS for the details. There it tells us that NVARCHAR(MAX) just isn't allowed. You'll have to limit the amount of searches that you do. I don't know of any way around this.

    ----------------------------------------------------
    The credit belongs to the man who is actually in the arena, whose face is marred by dust and sweat and blood...
    Theodore Roosevelt

    The Scary DBA
    Author of: SQL Server 2017 Query Performance Tuning, 5th Edition and SQL Server Execution Plans, 3rd Edition
    Product Evangelist for Red Gate Software

Viewing 2 posts - 1 through 2 (of 2 total)

You must be logged in to reply to this topic. Login to reply